我很想知道如何更新表格。
我使用以下两种方法来更新表。
哪一个是对的,哪个错了? 因为我在使用两者时得到了异常。
代码:
//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}
答案 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重命名该字段,然后执行查询。