2011-03-15 168 views
0

我是新手與android sqlite數據庫。現在我只是嘗試創建自定義數據庫管理器,並且在oncreate()函數中出現錯誤。我已經花了3天的時間弄清楚了,但不幸的是我仍然陷入了困境。任何輝煌的想法將不勝感激。Android的SQLite創建數據庫錯誤

public class DBManager extends SQLiteOpenHelper { 
private SQLiteDatabase db; 
private static Context myContext; 
public static final String DB_NAME = "goldenland.db"; 
public static final String TB_CAT = "tbl_categories"; 
public static final String TB_ARTICLE = "tbl_articles"; 
public static final String TB_SUBCAT = "tbl_subcategories"; 
public static final String TB_SCHEDULE = "tbl_schedule"; 
public static final String TB_CONTENT = "tbl_contents"; 
public static final String TB_CITY = "tbl_cities"; 
public static final String name = "name"; 
public static String DB_PATH = "/data/data/com.gokiri.goldenland/databases/"; 

public DBManager(Context context) { 
    super(context, DB_NAME, null, 1); 
    DBManager.myContext = context; 
} 

public void createDataBase() throws IOException { 
    boolean dbExit = checkDataBase(); 

    if (dbExit) { 
     System.out.println("Testing"); 
    } else { 
     this.getReadableDatabase(); 

     try { 
      copyDataBase(); 

     } catch (IOException e) { 
      throw new RuntimeException(e.getMessage()); 

     } 
    } 
} 

private boolean checkDataBase() { 
    SQLiteDatabase checkDb = null; 

    try { 
     String myPath = DB_PATH + DB_NAME; 

     checkDb = SQLiteDatabase.openDatabase(myPath, null, 
       SQLiteDatabase.OPEN_READWRITE); 
    } catch (SQLException e) { 

    } 

    if (checkDb != null) { 
     checkDb.close(); 
    } 
    return checkDb != null ? true : false; 
} 

public void copyDataBase() throws IOException { 

    InputStream myInput = myContext.getAssets().open("goldenland_2.sqlite"); 

    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 SQLiteException { 

    String myPath = DB_PATH + DB_NAME; 
    db = SQLiteDatabase.openDatabase(myPath, null, 
      SQLiteDatabase.OPEN_READWRITE); 

} 

Error Log Cat

+0

不應該靜態保存上下文。如果您從多個活動中訪問此代碼,則可能會導致崩潰。 – 2011-03-15 04:02:45

+0

所以我怎麼能使用這個代碼從多個活動。它是否與手機讀/寫訪問有關? – geekmyo 2011-03-15 04:06:57

回答

1

有幾件事情可能是錯的。你的數據庫真的存在於資源/資產嗎?你正在寫入正確的目錄嗎?通過調試器來進行診斷會大大有助於診斷問題。

您可以通過讓copyDatabase採取String參數(this.getReadableDatabase().getPath())來獲得理智檢查。您甚至可以嘗試將其寫入日誌以查看是否正在寫入正確的數據庫目錄。

1

很少有事情要檢查。 1.在方法checkDataBase中打開OPEN_READONLY模式的數據庫。 2.這是非常重要的檢查,數據庫的大小小於1 MB。 3.0之前的Android版本不允許超過1 MB的文件副本。

更新: 您需要拆分數據庫文件到每個1Mb的部分,複製所有零件逐一重新加入他們在一起。請參閱以下內容link

+0

我的數據庫文件大小大於1 MB,現在我正在使用基於Android 2.1的任何想法? – geekmyo 2011-03-15 05:43:43

+0

檢查我更新的答案。 – 2011-03-15 06:16:08

+0

你的回答很有用。你只是節省了我的時間。謝謝 – geekmyo 2011-03-15 07:38:29