2011-11-16 60 views
2

在我的應用我試圖獲取從數據庫中的一些數據,我顯示一個列表它。當我在我的摩托羅拉(2.1)和三星Ace(2.3)中運行應用程序時,我的一些模擬器工作正常。未能在Android應用程序中打開數據庫

但是,當我在三星Galaxy Tab,P7500(3.1)運行時,它顯示了以下錯誤

sqlite3_open_v2("/data/data/com.pack.store/databases/chaek.db", &handle, 6, NULL) failed 
    E/SQLiteDatabase(10021): Failed to open the database. closing it. 
    E/SQLiteDatabase(10021): android.database.sqlite.SQLiteDatabaseLockedException: database is locked 
    E/SQLiteDatabase(10021): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 
    E/SQLiteDatabase(10021): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983) 
    E/SQLiteDatabase(10021): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956) 
    E/SQLiteDatabase(10021): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021) 
    E/SQLiteDatabase(10021): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:750) 
    E/SQLiteDatabase(10021): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221) 
    E/SQLiteDatabase(10021): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149) 
    E/SQLiteDatabase(10021): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:223) 
    E/SQLiteDatabase(10021): at com.pack.sp.SPTocPage.getTOC(SPTocPage.java:246) 
    E/SQLiteDatabase(10021): at com.pack.sp.SPTocPage.onCreate(SPTocPage.java:82) 
    E/SQLiteDatabase(10021): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
    E/SQLiteDatabase(10021): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715) 
    E/SQLiteDatabase(10021): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767) 
    E/SQLiteDatabase(10021): at android.app.ActivityThread.access$1500(ActivityThread.java:122) 
    E/SQLiteDatabase(10021): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005) 
    E/SQLiteDatabase(10021): at android.os.Handler.dispatchMessage(Handler.java:99) 
    E/SQLiteDatabase(10021): at android.os.Looper.loop(Looper.java:132) 
    E/SQLiteDatabase(10021): at android.app.ActivityThread.main(ActivityThread.java:4028) 
    E/SQLiteDatabase(10021): at java.lang.reflect.Method.invokeNative(Native Method) 
    E/SQLiteDatabase(10021): at java.lang.reflect.Method.invoke(Method.java:491) 
    E/SQLiteDatabase(10021): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) 
    E/SQLiteDatabase(10021): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
    E/SQLiteDatabase(10021): at dalvik.system.NativeStart.main(Native Method) 
    E/SQLiteOpenHelper(10021): Couldn't open chaek.db for writing (will try read-only): 
    E/SQLiteOpenHelper(10021): android.database.sqlite.SQLiteDatabaseLockedException: database is locked 
    E/SQLiteOpenHelper(10021): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 
    E/SQLiteOpenHelper(10021): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983) 
    E/SQLiteOpenHelper(10021): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956) 
    E/SQLiteOpenHelper(10021): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021) 
    E/SQLiteOpenHelper(10021): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:750) 
    E/SQLiteOpenHelper(10021): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221) 
    E/SQLiteOpenHelper(10021): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149) 
    E/SQLiteOpenHelper(10021): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:223) 
    E/SQLiteOpenHelper(10021): at com.pack.sp.SPTocPage.getTOC(SPTocPage.java:246) 
    E/SQLiteOpenHelper(10021): at com.pack.sp.SPTocPage.onCreate(SPTocPage.java:82) 
    E/SQLiteOpenHelper(10021): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
    E/SQLiteOpenHelper(10021): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715) 
    E/SQLiteOpenHelper(10021): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767) 
    E/SQLiteOpenHelper(10021): at android.app.ActivityThread.access$1500(ActivityThread.java:122) 
    E/SQLiteOpenHelper(10021): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005) 
    E/SQLiteOpenHelper(10021): at android.os.Handler.dispatchMessage(Handler.java:99) 
    E/SQLiteOpenHelper(10021): at android.os.Looper.loop(Looper.java:132) 
    E/SQLiteOpenHelper(10021): at android.app.ActivityThread.main(ActivityThread.java:4028) 
    E/SQLiteOpenHelper(10021): at java.lang.reflect.Method.invokeNative(Native Method) 
    E/SQLiteOpenHelper(10021): at java.lang.reflect.Method.invoke(Method.java:491) 
    E/SQLiteOpenHelper(10021): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) 
    E/SQLiteOpenHelper(10021): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
    E/SQLiteOpenHelper(10021): at dalvik.system.NativeStart.main(Native Method) 
    E/SqliteDatabaseCpp(10021): sqlite3_open_v2("/data/data/com.pack.sp/databases/chaek.db", &handle, 1, NULL) failed 
    E/SQLiteDatabase(10021): Failed to open the database. closing it. 
    E/SQLiteDatabase(10021): android.database.sqlite.SQLiteDatabaseLockedException: database is locked 
    E/SQLiteDatabase(10021): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 
    E/SQLiteDatabase(10021): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983) 
    E/SQLiteDatabase(10021): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956) 
    E/SQLiteDatabase(10021): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:233) 
    E/SQLiteDatabase(10021): at com.pack.sp.SPTocPage.getTOC(SPTocPage.java:246) 
    E/SQLiteDatabase(10021): at com.pack.sp.SPTocPage.onCreate(SPTocPage.java:82) 
    E/SQLiteDatabase(10021): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
    E/SQLiteDatabase(10021): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715) 
    E/SQLiteDatabase(10021): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767) 
    E/SQLiteDatabase(10021): at android.app.ActivityThread.access$1500(ActivityThread.java:122) 
    E/SQLiteDatabase(10021): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005) 
    E/SQLiteDatabase(10021): at android.os.Handler.dispatchMessage(Handler.java:99) 
    E/SQLiteDatabase(10021): at android.os.Looper.loop(Looper.java:132) 
    E/SQLiteDatabase(10021): at android.app.ActivityThread.main(ActivityThread.java:4028) 
    E/SQLiteDatabase(10021): at java.lang.reflect.Method.invokeNative(Native Method) 
    E/SQLiteDatabase(10021): at java.lang.reflect.Method.invoke(Method.java:491) 
    E/SQLiteDatabase(10021): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) 
    E/SQLiteDatabase(10021): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
    E/SQLiteDatabase(10021): at dalvik.system.NativeStart.main(Native Method) 
    E/android.os.Debug( 284): Dumpstate > /data/log/dumpstate_app_error 

以下是我的DB類文件

public class ChaekHelper extends SQLiteOpenHelper 
{ 
    private static final int DATABASE_VERSION = 7; 
    private static final String DATABASE_NAME = "chaek.db"; 
    private List<Map<String, String>> ALL_TABLES = new ArrayList<Map<String, String>>(); 
    public ChaekHelper(Context context) 
    { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     this.onSetCreateQuery(context); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     for (int i = 0; i < ALL_TABLES.size(); i++) 
     { 
      db.execSQL("CREATE TABLE IF NOT EXISTS " + ALL_TABLES.get(i).get("TABLE_NAME") + " ("+ ALL_TABLES.get(i).get("FIELD_NAME") + ");"); 
     } 

     // create Index table 
     db.execSQL("DROP TABLE IF EXISTS dual;"); 
     db.execSQL("CREATE TABLE dual (idx INTEGER PRIMARY KEY, rownum TEXT);"); 
     db.execSQL("CREATE UNIQUE INDEX idx_rownum ON dual (rownum);"); 

     // create all tables 
     db.beginTransaction(); 
     try 
     { 
      for (int i = 1; i < 100; i++) { 
       String idxStr = "0" + i; 
       if (i > 9) 
        idxStr = idxStr.substring(1); 

       db.execSQL("INSERT INTO dual (idx, rownum) VALUES (" + i + ",'" + idxStr + "');"); 
      } 
      db.setTransactionSuccessful(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
     finally { 
      db.endTransaction(); 
     } 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     for (int i = 0; i < ALL_TABLES.size(); i++) { 
      db.execSQL("DROP TABLE IF EXISTS " + ALL_TABLES.get(i).get("TABLE_NAME") + ";"); 
     } 
     onCreate(db); 
    } 

    private void onSetCreateQuery(Context context) { 
     Map<String, String> params; 

     // 1. BOOK 
     params = new HashMap<String, String>(); 
     params.put("TABLE_NAME", context.getResources().getString(R.string.BOOK_TBL_NAME)); 
     params.put("FIELD_NAME", context.getResources().getString(R.string.BOOK_TBL_FIELDS)); 
     ALL_TABLES.add(params); 

     // 2. TOC 
     params = new HashMap<String, String>(); 
     params.put("TABLE_NAME", context.getResources().getString(R.string.TOC_TBL_NAME)); 
     params.put("FIELD_NAME", context.getResources().getString(R.string.TOC_TBL_FIELDS)); 
     ALL_TABLES.add(params); 

     // 3. BOOKMARK 
     params = new HashMap<String, String>(); 
     params.put("TABLE_NAME", context.getResources().getString(R.string.BM_TBL_NAME)); 
     params.put("FIELD_NAME", context.getResources().getString(R.string.BM_TBL_FIELDS)); 
     ALL_TABLES.add(params); 
    } 
} 

爲什麼會發生這樣的事情?任何一個可以解釋我這....我在這浪費了3天....

+0

嘗試閱讀有關鎖定SQLite數據庫一點。 http://stackoverflow.com/questions/151026/how-do-i-unlock-a-sqlite-database – zmbq

回答

0

你試試這個代碼

try { 
     db = this.openOrCreateDatabase("chaek.db", MODE_PRIVATE, null); 
     db.close(); 
     openDatabase(); 
     createTable(); 
    } catch (SQLException se) { 
     Toast.makeText(this, se.getMessage(), 1).show(); 
    } 
private void openDatabase() { 
    try { 
db = SQLiteDatabase.openDatabase("/data/data/com.pack.store/databases/chaek.db", 
       null, SQLiteDatabase.CREATE_IF_NECESSARY); 
     //Toast.makeText(this, "DB was opened!", 1).show(); 
    } catch (SQLiteException e) { 
     Toast.makeText(this, e.getMessage(), 1).show(); 
    } 
}// createDatabase 
1
public class BaseDAO extends OrmLiteSqliteOpenHelper { 

public static Dao<?, Integer> instanseDao(Context cont, Class c,String Dbname) { 
    File path=new File(DATABASE_PATH); 
    File f = new File(DATABASE_PATH+DB_NAME);//改默認數據庫目錄需先手動創建數據庫文件 
if (!path.exists()) { 
     path.mkdirs();// 創建一個目錄 
} 
if (!f.exists()) { 
     try { 
      f.createNewFile();//創建文件 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 




//how do?????? 

    SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f,null);//創建數據庫實例 
    BaseDAO baseDAO = new BaseDAO(cont); 
    //baseDAO.onCreate(db); 
    //baseDAO.onUpgrade(db,baseDAO.getConnectionSource(), OLD_DB_VERSION, DB_VERSION); 
    //baseDAO.close();//注意要先關掉 
    //db =SQLiteDatabase.openDatabase(DATABASE_PATH+DB_NAME, null, SQLiteDatabase.CREATE_IF_NECESSARY); 

    try { 
     Dao = baseDAO.getDao(c); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

    CONT=cont; 
    C=c; 
    DB_NAME = Dbname; 
    return Dao; 
} 
+1

SQLiteDatabase分貝= SQLiteDatabase.openOrCreateDatabase(F,NULL); //創建數據庫實例 BaseDAO baseDAO =新BaseDAO(續); baseDAO.onCreate(db); //baseDAO.onUpgrade(db,baseDAO.getConnectionSource(),OLD_DB_VERSION,DB_VERSION); //baseDAO.close();//注意要先關掉 db.close(); //哦,上帝! –

相關問題