2012-07-25 19 views
1

在Android 2.3.3中使用sqlcipher時。我收到錯誤。在Android中使用sqlcipher後獲取「sqlite3_open_v2(」mydatabase.db「,&句柄,6,NULL)失敗」

這裏是我DB.java類

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.util.Log; 
import net.sqlcipher.database.SQLiteDatabase; 
import net.sqlcipher.database.SQLiteDatabase.CursorFactory; 
import net.sqlcipher.database.SQLiteOpenHelper; 

public class DB { 

private static String _DB_NAME = "mydatabase.db"; 
private static int _DB_VERSION = 1; 

private Context _context; 
private DBHelper _helper; 

public DB(Context context) { 
SQLiteDatabase.loadLibs(context); 
this._context = context; 
this._helper = new DBHelper(this._context, _DB_NAME, null, _DB_VERSION); 
SQLiteDatabase sqdb = this._helper.getWritableDatabase("123"); 
sqdb.close(); 
} 

public void insertValuesInTable() { 

try { 
SQLiteDatabase sqdb = SQLiteDatabase.openOrCreateDatabase(_DB_NAME, "123",null); 
sqdb.execSQL("insert into mytable(category, total) values (1,"100");"); 
sqdb.close(); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
} 
private static class DBHelper extends SQLiteOpenHelper { 

     public DBHelper(Context context, String name, CursorFactory factory, 
       int version) { 

      super(context, name, factory, version); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 

      createTables(db); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     } 

     private void createTables(SQLiteDatabase db) { 

      try { 
       String query1; 

       query1 = "Create table if not exists mytable (category integer primary key, total text) ; "; 
       db.execSQL(query1); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 


} 

創建DB.java的對象,並利用它這樣

DB _db = new DB(getApplicationContext()); 
_db.insertValuesInTable(); 

當我執行這一行_db.insertValuesInTable();我得到這個錯誤

sqlite returned: error code = 14, msg = cannot open file at line 32288 of [6d326d44fd] 
sqlite returned: error code = 14, msg = os_unix.c:32288: (2) open(//mydatabase.db) - 
sqlite3_open_v2("mydatabase.db", &handle, 6, NULL) failed 
net.sqlcipher.database.SQLiteException: unable to open database file 
net.sqlcipher.database.SQLiteDatabase.dbopen(Native Method) 
net.sqlcipher.database.SQLiteDatabase.<init>(SQLiteDatabase.java:1952) 
net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:902) 
net.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:945) 
com.keane.database.DB.insertValuesInMd5Check(DB.java:133) 
com.keane.test2.UsageMonitorTestActivity.onCreate(UsageMonitorTestActivity.java:45) 
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
android.app.ActivityThread.access$1500(ActivityThread.java:117) 
android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
android.os.Handler.dispatchMessage(Handler.java:99) 
android.os.Looper.loop(Looper.java:123) 
android.app.ActivityThread.main(ActivityThread.java:3683) 
java.lang.reflect.Method.invokeNative(Native Method) 
java.lang.reflect.Method.invoke(Method.java:507) 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
dalvik.system.NativeStart.main(Native Method) 

我已經適當地包括所有.so.jar & .zip文件。我仍然得到這個錯誤。如何解決這個問題?

回答

2

您應該創建一個android.app.Application的子類,並在您的AndroidManifest.xml文件中註冊它。在致電SQLiteDatabase.openOrCreateDatabase之前,請通過從應用程序實例調用getDatabasePath來獲取數據庫文件的完整路徑,並將該值傳遞給SQLiteDatabase.openOrCreateDatabase