android
  • database
  • sqlite
  • database-design
  • 2012-02-08 95 views 0 likes 
    0

    我很想知道如何更新表格。Android:更新表格字段

    我使用下面两种方法来更新表。

    哪一个是正确的,哪里错了? 因为我同时使用了这两个异常。

    代码:

    //First One For Update 
    public boolean setFavouriteBook(String id){ 
        String query = "update Articles set type = 0 Where address = '"+id+"'"; 
        myDataBase.rawQuery(query, null); 
        return true; 
    } 
    
    // Second One for Update 
    //---updates a title--- 
    public boolean setFavourite(String address) 
    { 
        ContentValues args = new ContentValues(); 
        args.put("type", 0); 
    
        return myDataBase.update("Articles", args, "address = '"+address+"'", null) > 0; 
    } 
    

    和日志是:

    02-08 10:29:56.010: INFO/Database(10350): sqlite returned: error code = 8, msg = prepared statement aborts at 28: [UPDATE Articles SET type=? WHERE address = '3'] 
    02-08 10:29:56.010: ERROR/Database(10350): Error updating type=0 using UPDATE Articles SET type=? WHERE address = '3' 
    02-08 10:29:56.021: DEBUG/AndroidRuntime(10350): Shutting down VM 
    02-08 10:29:56.021: WARN/dalvikvm(10350): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350): FATAL EXCEPTION: main 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350): android.database.sqlite.SQLiteException: error code 8: attempt to write a readonly database 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at android.database.sqlite.SQLiteStatement.native_execute(Native Method) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:55) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1692) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1622) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at com.project.SkadebogenApp.DataBaseHelper.setFavourite(DataBaseHelper.java:417) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at com.project.SkadebogenApp.CommonWebViewActivity.onClick(CommonWebViewActivity.java:204) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at android.view.View.performClick(View.java:2408) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at android.view.View$PerformClick.run(View.java:8816) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at android.os.Handler.handleCallback(Handler.java:587) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at android.os.Handler.dispatchMessage(Handler.java:92) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at android.os.Looper.loop(Looper.java:123) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at java.lang.reflect.Method.invokeNative(Native Method) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at java.lang.reflect.Method.invoke(Method.java:521) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
    02-08 10:29:56.041: ERROR/AndroidRuntime(10350):  at dalvik.system.NativeStart.main(Native Method) 
    02-08 10:29:56.071: WARN/ActivityManager(59): Force finishing activity com.project.SkadebogenApp/.CommonWebViewActivity 
    02-08 10:29:56.600: WARN/ActivityManager(59): Activity pause timeout for HistoryRecord{450b78f8 com.project.SkadebogenApp/.CommonWebViewActivity} 
    

    回答

    3

    如果您的数据库位于SDCard中。

    如果你有你的数据库在SDCard中,所以你必须在你的Manifest文件中给予WRITE_EXTERNAL_STORAGE权限。你可以检查this答案同样的问题。

    否则,您可以使用

    SQLiteDatabase.OPEN_READWRITE而不是SQLiteDatabase.OPEN_READONLY当您打开您的数据库。

    checkDB = SQLiteDatabase.openDatabase(myPath, null, 
                   SQLiteDatabase.OPEN_READWRITE); 
    
    +0

    谢谢。有用。 – 2012-02-08 05:33:23

    0

    我不是100%肯定,但是,你不能使用地址栏的名字,它与数据库中的一些关键字反映。只要尝试用address1重命名该字段,然后执行查询即可。

    +0

    没有它不那样。 。 。 。因为我只用读模式打开数据库。并且还需要更新写入模式。 – 2012-02-08 07:16:43

    +0

    okies,这就是为什么我回答说我不是100%确定。在Visual Basic 6.0中,列名“name”遇到同样的问题 – Lucifer 2012-02-08 07:32:37

    2

    嘿错误显示在你的日志文件,你在读模式下打开数据库,在这里你都写在数据库中,以便只是getWritableDatabase();使用这种东西。可能会对您有所帮助
    或者您是否可以拥有WRITE_EXTERNAL_STORAGE权限。

    谢谢

    相关问题