2013-04-12 83 views
1

当我第一次执行应用程序时,我的DbHelper创建了数据库。但是,当我稍后尝试打开数据库时(在同一应用程序执行过程中,在另一个活动中),数据库会再次创建,因为checkDatabase()返回false,当然,由于存在表,因此会产生异常。当我第一次创建数据库时,我打开它并关闭它,所以我猜问题是文件没有刷新(这是第二次checkDatabase()返回false的唯一原因)。SQLiteOpenHelper在第一次执行时崩溃

重要的是要说这只发生在第一次执行过程中。在“不幸,已停止”消息之后,数据库访问正常工作。任何想法???

+0

体型以下链接.. http://www.reigndesign.com/blog/using-your- own-sqlite-database-in-android-applications/ – Amit

+1

没有你的代码,这将成为一个猜测游戏! –

+0

发表一些代码。例如,'checkDatabase()'。 – laalto

回答

0

您可以参考下面的代码时,创建新的数据库,检查现有的DB

public class DataBaseHelper extends SQLiteOpenHelper { 

private static String DB_PATH; 
private static String DB_NAME = "podcastDB.db"; 
private SQLiteDatabase myDataBase; 
private final Context myContext; 
SharedPreferences sharedPreferences; 

public DataBaseHelper(Context context) { 

    super(context, DB_NAME, null, 1); 
    this.myContext = context; 
    DB_PATH = "/data/data/" + myContext.getPackageName() + "/databases/"; 

    sharedPreferences = PreferenceManager 
      .getDefaultSharedPreferences(myContext); 
} 

/** 
* Creates a empty database on the system and rewrites it with your own 
* database. 
* */ 
public void createDataBase() throws IOException { 

    // ---Check whether database is already created or not--- 
    boolean dbExist = checkDataBase(); 

    if (dbExist) { 
    } else { 
     this.getReadableDatabase(); 
     try { 
      // ---If not created then copy the database--- 
      copyDataBase(); 
     } catch (IOException e) { 
      throw new Error("Error copying database"); 
     } 
    } 

} 

/** 
* Check if the database already exist to avoid re-copying the file each 
* time you open the application. 
* 
* @return true if it exists, false if it doesn't 
*/ 
private boolean checkDataBase() { 
    try { 
     String myPath = DB_PATH + DB_NAME; 
     File f = new File(myPath); 
     if (f.exists()) 
      return true; 
     else 
      return false; 
    } catch (SQLiteException e) { 
     Log.e("Podcast", "There was an error", e); 
     return false; 
    } 
} 

/** 
* Copies your database from your local assets-folder to the just created 
* empty database in the system folder, from where it can be accessed and 
* handled. This is done by transfering bytestream. 
* */ 
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_READWRITE); 

} 

@Override 
public synchronized void close() { 

    if (myDataBase != null) 
     myDataBase.close(); 

    super.close(); 

} 

@Override 
public void onCreate(SQLiteDatabase db) { 

} 

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

} 
} 
+0

谢谢Nirali!由于任何奇怪的原因,checkDB = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READONLY);在检查数据库时给了我例外,但是你的File版本是完美的。 – trumpetero

+0

欢迎您。也请投票答复。 – Nirali

+0

我原以为会有这个问题的解决方案,只依赖于SQLite类,即不诉诸检查文件系统。 – Tom