2012-02-08 5 views
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; 
} 

그리고 로그는 다음과 같습니다 당신이 열 이름으로 주소를 사용할 수 없습니다, 나는 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 권한을 가질 수도 있습니다.

감사합니다.