2012-02-08 14 views
0

テーブルを更新する方法が不思議です。Android:テーブルフィールドの更新に関する問題

私は以下の2つの方法を使用してテーブルを更新しています。

どちらが正しいのでしょうか、それに何が間違っていますか? 私は両方を使用している間に例外を得ました。

コード:

//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; 
} 

、ログがある:あなたが列名などのアドレスを使用することはできません、私はいない100%確信して

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にある場合は、マニフェストファイルにWRITE_EXTERNAL_STORAGE権限を与える必要があります。あなたは同じ問題についてthis答えをチェックすることができます。エルス

、あなたのデータベースを開いているときは、

SQLiteDatabase.OPEN_READWRITEの代わりSQLiteDatabase.OPEN_READONLYを使用することができます。

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

ありがとうございます。できます。 –

0

、しかし、それは、データベース内のいくつかのキーワードを反映します。 address1でそのフィールドの名前を変更してから、クエリを実行してみてください。

+0

いいえそのようにはありません。 。 。 。その理由は、私は読み取りモードでのみデータベースを開きます。また、更新のためには、書き込みモードも必要です。 –

+0

okies、それが私が100%確信していないと答える理由です。私はVisual Basic 6.0で列名 "name"と同じ種類の問題が発生しました – Lucifer

2

ねえ、あなたが読み取り可能なモードであなたのDBを開いて、ここであなただけのgetWritableDatabase();使用このようにデータベースで何かを書いているログファイルのエラーを示しています。
に役立つかもしれないし、WRITE_EXTERNAL_STORAGE権限を取ることができるかもしれません。

ありがとうございました

関連する問題