【问题标题】:SQLite insert query errorSQLite 插入查询错误
【发布时间】:2012-11-22 10:17:51
【问题描述】:

我正在使用以下查询将数据插入 Android 的 SQLite 数据库。

INSERT INTO ServerData 
VALUES('404', '192.168.145.101', '1', '1', '1'),
      ('404', '192.168.145.101', '2', '1', '1')

但是我收到一个错误,LogCat 详细信息如下:

11-22 15:14:56.588: E/Database(1609): 在准备“插入到 ServerData VALUES('404','192.168.145.101', '1','1','1'),('404','192.168.145.101','2','1','1')'。
11-22 15:14:56.618: W/dalvikvm(1609): threadid=10: 线程以未捕获的异常退出 (group=0x40015560)
11-22 15:14:56.648:E/AndroidRuntime(1609):致命异常:AsyncTask #1
11-22 15:14:56.648: E/AndroidRuntime(1609): java.lang.RuntimeException: 执行 doInBackground() 时出错
11-22 15:14:56.648: E/AndroidRuntime(1609): 在 android.os.AsyncTask$3.done(AsyncTask.java:200)
11-22 15:14:56.648: E/AndroidRuntime(1609): 在 java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 11-22 15:14:56.648: E/AndroidRuntime(1609): 在 java.util.concurrent.FutureTask.setException(FutureTask.java:125) 11-22 15:14:56.648: E/AndroidRuntime(1609): 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 11-22 15:14:56.648: E/AndroidRuntime(1609): 在 java.util.concurrent.FutureTask.run(FutureTask.java:138) 11-22 15:14:56.648: E/AndroidRuntime(1609): 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 11-22 15:14:56.648: E/AndroidRuntime(1609): 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 11-22 15:14:56.648: E/AndroidRuntime(1609): 在 java.lang.Thread.run(Thread.java:1019) 11-22 15:14:56.648: E/AndroidRuntime(1609): 引起: android.database.sqlite.SQLiteException: near ",": 语法错误: INSERT INTO ServerData VALUES('404','192.168.145.101', '1','1','1'),('404','192.168.145.101','2','1','1') 11-22 15:14:56.648:E/AndroidRuntime(1609):在 android.database.sqlite.SQLiteDatabase.native_execSQL(本机方法) 11-22 15:14:56.648: E/AndroidRuntime(1609): 在 android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1763) 11-22 15:14:56.648: E/AndroidRuntime(1609): 在 com.pcloud.fileshare.database.DBMethods.InsertToServerTable(DBMethods.java:228) 11-22 15:14:56.648: E/AndroidRuntime(1609): 在 com.pcloud.fileshare.dataAccess.commonMethod.updateServerTable(commonMethod.java:472) 11-22 15:14:56.648: E/AndroidRuntime(1609): 在 com.pcloud.fileshare.mainPages.userLogin$backgroundTask.doInBackground(userLogin.java:238) 11-22 15:14:56.648: E/AndroidRuntime(1609): 在 com.pcloud.fileshare.mainPages.userLogin$backgroundTask.doInBackground(userLogin.java:1) 11-22 15:14:56.648: E/AndroidRuntime(1609): 在 android.os.AsyncTask$2.call(AsyncTask.java:185) 11-22 15:14:56.648: E/AndroidRuntime(1609): 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 11-22 15:14:56.648: E/AndroidRuntime(1609): ... 4 更多 11-22 15:15:00.059: E/WindowManager(1609): 活动 com.pcloud.fileshare.mainPages.userLogin 泄露了最初添加在这里的窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@40529668 11-22 15:15:00.059: E/WindowManager(1609): android.view.WindowLeaked: Activity com.pcloud.fileshare.mainPages.userLogin 泄露了窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@40529668最初是在这里添加的 11-22 15:15:00.059: E/WindowManager(1609): 在 android.view.ViewRoot.(ViewRoot.java:258) 11-22 15:15:00.059: E/WindowManager(1609): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 11-22 15:15:00.059: E/WindowManager(1609): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 11-22 15:15:00.059: E/WindowManager(1609): 在 android.view.Window$LocalWindowManager.addView(Window.java:424) 11-22 15:15:00.059: E/WindowManager(1609): 在 android.app.Dialog.show(Dialog.java:241) 11-22 15:15:00.059: E/WindowManager(1609): at com.pcloud.fileshare.mainPages.userLogin$backgroundTask.onPreExecute(userLogin.java:251) 11-22 15:15:00.059: E/WindowManager(1609): 在 android.os.AsyncTask.execute(AsyncTask.java:391) 11-22 15:15:00.059: E/WindowManager(1609): at com.pcloud.fileshare.mainPages.userLogin$1.onItemClick(userLogin.java:221) 11-22 15:15:00.059: E/WindowManager(1609): 在 android.widget.AdapterView.performItemClick(AdapterView.java:284) 11-22 15:15:00.059: E/WindowManager(1609): 在 android.widget.ListView.performItemClick(ListView.java:3513) 11-22 15:15:00.059: E/WindowManager(1609): 在 android.widget.AbsListView$PerformClick.run(AbsListView.java:1812) 11-22 15:15:00.059: E/WindowManager(1609): 在 android.os.Handler.handleCallback(Handler.java:587) 11-22 15:15:00.059: E/WindowManager(1609): 在 android.os.Handler.dispatchMessage(Handler.java:92) 11-22 15:15:00.059: E/WindowManager(1609): 在 android.os.Looper.loop(Looper.java:123) 11-22 15:15:00.059: E/WindowManager(1609): 在 android.app.ActivityThread.main(ActivityThread.java:3683) 11-22 15:15:00.059: E/WindowManager(1609): 在 java.lang.reflect.Method.invokeNative(Native Method) 11-22 15:15:00.059: E/WindowManager(1609): 在 java.lang.reflect.Method.invoke(Method.java:507) 11-22 15:15:00.059: E/WindowManager(1609): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 11-22 15:15:00.059: E/WindowManager(1609): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 11-22 15:15:00.059: E/WindowManager(1609): at dalvik.system.NativeStart.main(Native Method)

相同的查询在 SQLite Expert 中可以正常工作,但在代码中却不行

【问题讨论】:

  • 你能分享你的插入查询代码
  • 感谢您的建议 :-) 实际上我正在尝试每个答案。现在我得到了想要的,并接受了答案。

标签: java android sql sqlite android-sqlite


【解决方案1】:

在 SQLite 中,不能使用逗号分隔符在表中插入多行。所以,对于你的情况,你可以试试这个:

INSERT INTO ServerData
      SELECT '404','192.168.145.101','1','1','1'
UNION SELECT '404','192.168.145.101','2','1','1';

【讨论】:

    【解决方案2】:

    查看https://stackoverflow.com/a/5009740/1434631中的解决方案

    您不能使用逗号分隔sqlite中插入多行..

    最好用SQLiteDatabase

    ContentValues values = new ContentValues();
    for(int i = 0; i<=5; i++) {
    values.put(COLUMN_NAME, i);
    values.put(COLUMN_NAME, 0);
    db.insert(TABLE_NAME, null, values);
    }
    

    【讨论】:

      【解决方案3】:

      试试这个 你不能插入多个用逗号分隔的值

      INSERT INTO ServerData VALUES('404','192.168.145.101','1','1','1')
      
       INSERT INTO ServerData VALUES ('404','192.168.145.101','2','1','1')
      

      试试这个

       INSERT INTO 'tablename' ('column1', 'column2') VALUES
          ('data1', 'data2'),
          ('data3', 'data4'),
          ('data5', 'data6'),
         ('data7', 'data8');
      

      可以改写为sqlite:

       INSERT INTO 'tablename'
        SELECT 'data1' AS 'column1',
               'data2' AS 'column2'
       UNION SELECT 'data3', 'data4'
        UNION SELECT 'data5', 'data6'
        UNION SELECT 'data7', 'data8'
      

      【讨论】:

        猜你喜欢
        • 2012-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-29
        • 1970-01-01
        相关资源
        最近更新 更多