2013-04-01 68 views
0

我有一个应用程序从sqlite数据库浏览器读入数据库,然后复制数据库并继续。然而,每次我在sqlite数据库浏览器中更改数据库时,我都必须卸载并重新安装应用程序以再次复制它。 (仅适用于大学作业)首次启动时,它总是崩溃,然后在第二次启动。是否有避免这种崩溃?应用程序首次启动崩溃android

下面是我的一些代码:

public DbH(Context context) throws IOException { 
    super(context, DB_NAME, null, 1); 
    this.mycontext = context; 
} 

public void createdatabase() throws IOException { 
    boolean dbexist = checkdatabase(); 
    if (dbexist) { 
     System.out.println(" Database exists."); 
    } else { 
     this.getReadableDatabase(); 
     try { 
      copydatabase(); 
     } catch (IOException e) { 
      throw new Error("Error copying database"); 
     } 
    } 
} 

private boolean checkdatabase() { 
    // SQLiteDatabase checkdb = null; 
    boolean checkdb = false; 
    try { 
     String myPath = DB_PATH + DB_NAME; 
     File dbfile = new File(myPath); 
     checkdb = SQLiteDatabase.openDatabase(myPath, null, 
       SQLiteDatabase.OPEN_READWRITE) != null; 
     checkdb = dbfile.exists(); 
    } catch (SQLiteException e) { 
     System.out.println("Database doesn't exist"); 
    } 

    return checkdb; 
} 

private void copydatabase() throws IOException { 

    InputStream myinput = mycontext.getAssets().open(DB_NAME); 
    String outfilename = DB_PATH + DB_NAME; 
    OutputStream myoutput = new FileOutputStream(outfilename); 

    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myinput.read(buffer)) > 0) { 
     myoutput.write(buffer, 0, length); 
    } 

    myoutput.flush(); 
    myoutput.close(); 
    myinput.close(); 

} 

public void opendatabase() throws SQLException { 
    // Open the database 
    String mypath = DB_PATH + DB_NAME; 
    myDataBase = SQLiteDatabase.openDatabase(mypath, null, 
      SQLiteDatabase.OPEN_READONLY); 

} 

public synchronized void close() { 
    if (myDataBase != null) { 
     myDataBase.close(); 
    } 
    super.close(); 

} 

下面是错误的logcat的

04-01 22:24:55.909: E/SqliteDatabaseCpp(25335): DB info: sqlite3_open_v2("/data/data/com.example.databasebrowser/databases , key = T", &handle, 2,  NULL) failed 
    04-01 22:24:55.909: E/SqliteDatabaseCpp(25335): DB info: errno = 2, errno message = No such file or directory 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): Failed to open the database. closing it. 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1093) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1050) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1026) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at com.example.databasebrowser.DbH.checkdatabase(DbH.java:60) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at com.example.databasebrowser.DbH.createdatabase(DbH.java:41) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at com.example.databasebrowser.MyActivity.validateLogin(MyActivity.java:99) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at com.example.databasebrowser.MyActivity.onClick(MyActivity.java:66) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at android.view.View.performClick(View.java:3538) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at android.view.View$PerformClick.run(View.java:14330) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at android.os.Handler.handleCallback(Handler.java:608) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at android.os.Handler.dispatchMessage(Handler.java:92) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at android.os.Looper.loop(Looper.java:156) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at android.app.ActivityThread.main(ActivityThread.java:4977) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at java.lang.reflect.Method.invokeNative(Native Method) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at java.lang.reflect.Method.invoke(Method.java:511) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    04-01 22:24:55.949: E/SQLiteDatabase(25335): at dalvik.system.NativeStart.main(Native Method) 
    04-01 22:24:56.450: E/SqliteDatabaseCpp(25335): SELECT locale FROM android_metadata failed 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): Failed to open the database. closing it. 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): android.database.sqlite.SQLiteException: no such table: android_metadata 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:2186) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1094) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1050) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1026) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at com.example.databasebrowser.DbH.opendatabase(DbH.java:98) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at com.example.databasebrowser.MyActivity.validateLogin(MyActivity.java:105) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at com.example.databasebrowser.MyActivity.onClick(MyActivity.java:66) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at android.view.View.performClick(View.java:3538) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at android.view.View$PerformClick.run(View.java:14330) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at android.os.Handler.handleCallback(Handler.java:608) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at android.os.Handler.dispatchMessage(Handler.java:92) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at android.os.Looper.loop(Looper.java:156) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at android.app.ActivityThread.main(ActivityThread.java:4977) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at java.lang.reflect.Method.invokeNative(Native Method) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at java.lang.reflect.Method.invoke(Method.java:511) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    04-01 22:24:56.470: E/SQLiteDatabase(25335): at dalvik.system.NativeStart.main(Native Method) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): FATAL EXCEPTION: main 
    04-01 22:24:56.480: E/AndroidRuntime(25335): android.database.sqlite.SQLiteException: no such table: android_metadata 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:2186) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1094) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1050) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1026) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at com.example.databasebrowser.DbH.opendatabase(DbH.java:98) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at com.example.databasebrowser.MyActivity.validateLogin(MyActivity.java:105) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at com.example.databasebrowser.MyActivity.onClick(MyActivity.java:66) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at android.view.View.performClick(View.java:3538) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at android.view.View$PerformClick.run(View.java:14330) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at android.os.Handler.handleCallback(Handler.java:608) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at android.os.Handler.dispatchMessage(Handler.java:92) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at android.os.Looper.loop(Looper.java:156) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at android.app.ActivityThread.main(ActivityThread.java:4977) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at java.lang.reflect.Method.invokeNative(Native Method) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at java.lang.reflect.Method.invoke(Method.java:511) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    04-01 22:24:56.480: E/AndroidRuntime(25335): at dalvik.system.NativeStart.main(Native Method) 
+3

你可以添加[logcat](http://developer.android.com/tools/help/logcat.html)到你的问题吗? –

+0

请添加你的logcat,没有它我们不能帮你。 – Sajmon

+0

你应该学习如何使用catch块。为什么你应该抛出新的错误(“bla”)'当你已经有一个'IOException'方法更多的细节?另外:不要在Android上使用'System.out.println()',使用'Log'并且如果你记录一个错误:'Log.e(TAG,“message”,e);'(唯一的例外是当你真的不关心那次事故,比不记录......但这是非常罕见的......) – WarrenFaith

回答

0

你应该继承SQLiteOpenHelper避免DB创建错误。这将处理所有的数据库创建,更新和检查存在的问题 - 而无需自己动手。另外,它将以默认推荐路径创建数据库文件。

以下内容可以是您可以在代码中使用的DB开放帮助程序类。

class myDbHelper extends SQLiteOpenHelper { 
    public myDbHelper(Context context, String name, CursorFactory factory, 
      int version) { 
     super(context, name, factory, version); 
    } 

    // Called when no database exists on disk 
    @Override 
    public void onCreate(SQLiteDatabase _db) { 
     _db.execSQL(DATABASE_CREATE); 
    } 

    // Called when there is a database version mismatch meaning that 
    // the version of the database on disk needs to be upgraded to 
    // the current version. 
    @Override 
    public void onUpgrade(SQLiteDatabase _db, int _oldVersion, 
      int _newVersion) { 
     // Upgrade the existing database to conform to the new version. 
     _db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
     // Create a new one. 
     onCreate(_db); 
    } 
} 

Lars Vogel对此有nice tutorial