2012-02-17 17 views
0

誰も問題を説明できますか? 自分のデータベースを使用するアプリケーションを開発しました。すべてがうまくいきましたが、一日で私はエラーがアンドロイドデバイスでデータベースを開くことはできませんが、エミュレータで行うことができます

android.database.sqlite.SQLiteDatabaseCorruptExceptionある

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

でエラーが発生するようになった:コンパイル中に、::データベースのディスクイメージが不正です]を選択しますカウント(*)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テーブルがあることを確認しました。

"words"テーブルに "_id"という列があることを確認しました。

アプリケーションフォルダ(データベースを含む)を手動で削除しようとしましたが、手伝っていません。

私も私のアプリケーションパッケージの名前を変更しようとした...

+0

同じ結果で他のデバイス(HTC Wildfire)でプログラムを起動しようとしました。 S.私のSQLiteデータベースのwords.dbが291 KBで、コンパイルされたAPKが143 KBしかないことは間違いありませんか? – forcelain

答えて

0

私は、データベース・ファイルを再作成した後、問題が消えたそのデータベースのバージョンは、あなたが3

+0

答えをありがとう。残念ながら、それは助けにはなりません。 – forcelain

0

として、そのデータベースのバージョンを変更することができると思います。 データベースファイルにもう1つのテーブル "sqlite_sequence"があるようです。テーブルには、nameとseqという2つの列が含まれている必要があります。作成したテーブルの名前(android_metadataを除く)の名前は「name」、これらのテーブルの行数は「seq」です。

関連する問題