2013-08-06 140 views
1

我有一個問題,當我嘗試啓動我的項目在Android 4.2.2。 這裏是堆棧跟蹤:安卓錯誤與sqlcipher版本Android 4.2.2

08-06 11:00:50.041: E/AndroidRuntime(10606): Caused by: net.sqlcipher.database.SQLiteException: not an error 
08-06 11:00:50.041: E/AndroidRuntime(10606): at net.sqlcipher.database.SQLiteDatabase.dbopen(Native Method) 
08-06 11:00:50.041: E/AndroidRuntime(10606): at net.sqlcipher.database.SQLiteDatabase.<init>(SQLiteDatabase.java:1951) 
08-06 11:00:50.041: E/AndroidRuntime(10606): at de.greenrobot.dao.wrapper.SQLiteDatabaseWrapper.<init>(SQLiteDatabaseWrapper.java:61) 
08-06 11:00:50.041: E/AndroidRuntime(10606): at de.greenrobot.dao.wrapper.SQLiteDatabaseWrapper.openDatabase(SQLiteDatabaseWrapper.java:224) 
08-06 11:00:50.041: E/AndroidRuntime(10606): at de.greenrobot.dao.wrapper.SQLiteDatabaseWrapper.openOrCreateDatabase(SQLiteDatabaseWrapper.java:276) 
08-06 11:00:50.041: E/AndroidRuntime(10606): at de.greenrobot.dao.wrapper.SQLiteOpenHelperWrapper.getWritableDatabase(SQLiteOpenHelperWrapper.java:95) 
08-06 11:00:50.041: E/AndroidRuntime(10606): at com.e_i.bad.utils.DAOManager.DAOInit(DAOManager.java:62) 

這在Android 4.0.4工作得很好,但是當我啓動Android 4.2多數民衆贊成時間崩潰,除此之外。我給官方網站sqlcipher的來源,我希望這是我已採取的最後一個來源(名稱是SQLCipher + for + android + 2.2.0),我沒有看到這個項目的最新版本。

預先感謝你的答案(我希望這不是一個重複的問題引起我搜索並沒有找到答案......)

編輯: 來源:

helper = new DaoMaster.DevOpenHelper(getContext(), id, password, null); 
      db = helper.getWritableDatabase(); 
      daoMaster = new DaoMaster(db); 
      daoSession = daoMaster.newSession(); 

public static class DevOpenHelper extends OpenHelper { 

    public DevOpenHelper(Context context, String name, String password, CursorFactory factory) { 
     super(context, name, password, factory); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabaseWrapper db, int oldVersion, int newVersion) { 
     dropAllTables(db, true); 
     onCreate(db); 
    } 
} 

public static abstract class OpenHelper extends SQLiteOpenHelperWrapper { 

    public OpenHelper(Context context, String name, String password, CursorFactory factory) { 
     super(context, name, password, factory, SCHEMA_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabaseWrapper db) { 
     createAllTables(db, false); 
    } 
} 

public synchronized SQLiteDatabaseWrapper getWritableDatabase() { 
    if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) { 
     return mDatabase; // The database is already open for business 
    } 

    if (mIsInitializing) { 
     throw new IllegalStateException("getWritableDatabase called recursively"); 
    } 

    // If we have a read-only database open, someone could be using it 
    // (though they shouldn't), which would cause a lock to be held on 
    // the file, and our attempts to open the database read-write would 
    // fail waiting for the file lock. To prevent that, we acquire the 
    // lock on the read-only database, which shuts out other users. 

    boolean success = false; 
    SQLiteDatabaseWrapper db = null; 
    if (mDatabase != null) 
     mDatabase.lock(); 
    try { 
     mIsInitializing = true; 
     if (mName == null) { 
      db = SQLiteDatabaseWrapper.create(null, mPassword); 
     } else { 
      String path = mContext.getDatabasePath(mName).getPath(); 

      File dbPathFile = new File(path); 
      if (!dbPathFile.exists()) 
       dbPathFile.getParentFile().mkdirs(); 

      db = SQLiteDatabaseWrapper.openOrCreateDatabase(path, mPassword, mFactory); 
     } 

     int version = db.getVersion(); 
     if (version != mNewVersion) { 
      db.beginTransaction(); 
      try { 
       if (version == 0) { 
        onCreate(db); 
       } else { 
        if (version > mNewVersion) { 
         Log.w(TAG, "Can't downgrade read-only database from version " + version + " to " + mNewVersion + ": " + db.getPath()); 
        } 
        onUpgrade(db, version, mNewVersion); 
       } 
       db.setVersion(mNewVersion); 
       db.setTransactionSuccessful(); 
      } finally { 
       db.endTransaction(); 
      } 
     } 

     onOpen(db); 
     success = true; 
     return db; 
    } finally { 
     mIsInitializing = false; 
     if (success) { 
      if (mDatabase != null) { 
       try { 
        mDatabase.close(); 
       } catch (Exception e) { 
       } 
       mDatabase.unlock(); 
      } 
      mDatabase = db; 
     } else { 
      if (mDatabase != null) 
       mDatabase.unlock(); 
      if (db != null) 
       db.close(); 
     } 
    } 
} 

public SQLiteOpenHelperWrapper(Context context, String name, String password, CursorFactory factory, int version) { 
    if (version < 1) 
     throw new IllegalArgumentException("Version must be >= 1, was " + version); 

    mContext = context; 
    mName = name; 
    mPassword = password; 
    mFactory = factory; 
    mNewVersion = version; 

    if (mPassword != null && mPassword.length() > 0) { 
     // Load SQLcipher libraries if needed 
     SQLiteDatabaseWrapper.loadLibs(mContext); 
    } 
} 

編輯2:

SQLiteDatabase.loadLibs(getContext()); 
     String path = ""; 
     try { 
      path = getContext().getDatabasePath(pathDB + ".db").getPath(); 
     } catch (NullPreferencesException e) { 

     } 
     File dbPathFile = new File(path); 
     if (!dbPathFile.exists()) { 
      dbPathFile.getParentFile().mkdirs(); 
     } 
     SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(path, "123456", null); 
     db = new SQLiteDatabaseWrapper(database); 

     daoMaster = new DaoMaster(db); 
     daoSession = daoMaster.newSession(); 
+0

嘗試升級到適用於Android 2.2.1的SQLCipher。 – CommonsWare

+0

我試過了,但是讓我得到的錯誤與使用相同堆棧的版本2.2.0相同。如果能幫助你理解,我可以給出部分代碼。 – Illuyankas

+0

在此發佈一些信息,或者更好地創建一個可重複的測試用例。 – CommonsWare

回答

1

最後這是工作。爲此,我只需要greenDao替換所有導入庫android.database通過net.sqlcipher然後我導出這個新的greenDao在.jar我把SQLCipher.jar不要忘記導入commons-codec.jar和guavra-r09.jar plus來自SQLCipher和文件夾的文件夾armeabi和文件夾x86資產文件icudt46l.zip。

在我的情況下,我有一個項目daocore包含SQLCipher,是依賴項和我的項目Android依賴於daocore項目多數民衆贊成工作在Android 4.1和更少,但不是在4.2和更多,所以問題是項目之間的依賴關係,我不知道爲什麼,但如果你在源代碼項目中導入所有的Android工作,它就可以了。