Android:更新表字段的问题

时间:2012-02-08 05:02:06

标签: android database sqlite database-design

我很想知道如何更新表格。

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

哪一个是对的,哪个错了? 因为我在使用两者时得到了异常。

代码:

//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 个答案:

答案 0 :(得分:3)

如果您的数据库位于SD卡中。

如果您的数据库位于SDCard中,那么您必须在Manifest文件中授予WRITE_EXTERNAL_STORAGE权限。您可以针对同一问题查看this答案。

您可以使用

在打开数据库时,

SQLiteDatabase.OPEN_READWRITE而不是SQLiteDatabase.OPEN_READONLY

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

答案 1 :(得分:2)

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

由于

答案 2 :(得分:0)

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