2012-02-17 23 views
0

任何人都可以解釋什麼是問題? 我開發了我的應用程序,它使用我自己的數據庫。所有工作正常,但有一天,我開始收到錯誤在無法在Android設備上打開我的數據庫,但可以在模擬器上

long rowsCount = DatabaseUtils.queryNumEntries(myDataBase, table); 

的錯誤是

android.database.sqlite.SQLiteDatabaseCorruptException:數據庫磁盤映像格式有誤:,編譯時:SELECT (*)FROM words

最奇怪的是我只在我的設備(lg p500)上收到錯誤,並且程序在仿真器上正常工作。

dbHelper = new MySQLiteHelper(context); 
    try { 
     dbHelper.createDataBase(); 
    }catch(IOException ioe) 
    { 
     throw new Error("Unable to create database"); 
    } 
... 
dbHelper.openDataBase(); 
long tableSize = dbHelper.countTableRows(MySQLiteHelper.TABLE_WORDS); //The error appears 
... 

MySQLiteHelper代碼:

public class MySQLiteHelper extends SQLiteOpenHelper { 

private static final String DATABASE_NAME = "words.db"; 
private static final int DATABASE_VERSION = 1; 
private static final String DB_PATH = "/data/data/ru.my.program/databases"; 
public static final String TABLE_WORDS = "words"; 
public static final String COLUMN_ID = "_id"; 
public static final String COLUMN_WORD = "word"; 
private final Context myContext; 

public SQLiteDatabase myDataBase; 

public MySQLiteHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    myContext = context; 
} 

@Override 
public void onCreate(SQLiteDatabase database) { 
} 

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

public void createDataBase() throws IOException{   
    boolean dbExist = checkDataBase(); 
    if(dbExist){ 
     //do nothing - database already exist 
    }else{ 
     //By calling this method and empty database will be created into the default system path 
     //of your application so we are gonna be able to overwrite that database with our database. 
     this.getReadableDatabase(); 
     this.close(); 
     try 
     { 
      copyDataBase(); 
     } 
     catch(IOException e) 
     { 
      throw new Error("Error copying database"); 
     } 
    } 
} 

private boolean checkDataBase(){  
    File dbFile = new File(DB_PATH + "/" + DATABASE_NAME); 
    return dbFile.exists(); 

} 

private void copyDataBase() throws IOException{  
    //Open your local db as the input stream 
    InputStream myinput = myContext.getAssets().open(DATABASE_NAME); 

    // Path to the just created empty db 
    String outfilename = DB_PATH + "/" +DATABASE_NAME; 

    //Open the empty db as the output stream 
    OutputStream myoutput = new FileOutputStream("/data/data/ru.my.program/databases/words.db"); 

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

    //Close the streams 
    myoutput.flush(); 
    myoutput.close(); 
    myinput.close(); 
} 

public void openDataBase() throws SQLException{ 
    String myPath = DB_PATH + "/" +DATABASE_NAME; 
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS|SQLiteDatabase.OPEN_READONLY); 
    Log.i(MySQLiteHelper.class.getName(), "Open DB"); 
} 

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

} 
public long countTableRows(String table) 
{ 
    long rowsCount = DatabaseUtils.queryNumEntries(myDataBase, table); 
    return rowsCount; 
} 

我已經檢查了數據庫與DDMS的設備上,並相信它是在一個合適的複製

我與數據庫相關的代碼和資產一樣。

我已檢查數據庫是否具有locale =「ru_RU」的android_metadata表。

我檢查了我在「單詞」表中有「_id」列。

我試圖手動刪除應用程序文件夾(與數據庫),但它沒有幫助。

我甚至嘗試重新命名我的應用程序包...

+0

試圖在其他設備(HTC Wildfire)上啓動程序,結果相同。 P.S.可以,我的SQLite數據庫words.db是291 KB,我編譯的APK只有143 KB? – forcelain 2012-02-17 08:47:32

回答

0

我認爲它的數據庫版本,以便您可以更改數據庫的版本爲3

+0

感謝您的回答。不幸的是它沒有幫助。 – forcelain 2012-02-17 05:40:02

0

我已經重新創建數據庫文件後,問題已經消失。 似乎數據庫文件應該有一個表「sqlite_sequence」。該表應該包含兩列:名稱和序號。 「name」表示您創建的表(不包括android_metadata)的名稱,「seq」表示這些表中的行數。

相關問題