2011-01-20 1 views
1

SQLite JDBCコネクタを使用して生成したSQLiteデータベースがhereです。外部で生成されたSQLiteデータベースは、AndroidのSQLiteOpenHelperによって読み取り専用と見なされます

このデータベースをAndroid携帯のSDカードにコピーし、SQLiteOpenHelperを使用してこのデータベースを開こうとしました。私は次の例外を受け取ります:

ERROR/SQLiteOpenHelper(7373): android.database.sqlite.SQLiteException: attempt to write a readonly database: BEGIN EXCLUSIVE; 

ERROR/AndroidRuntime(7373): Caused by: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 0 to 1: /mnt/sdcard/4Trak/4Trak.db 

これは私には意味がありません。なぜそれは読み取り専用のデータベースですか?私は最初にそれを生成するために書き込むことができました。また、android_metadataテーブルが必要であることがわかったときに、SQLiteブラウザを使用して追加しました。

答えて

4

Sqliteは、アプリケーションデータベースディレクトリのデータベースのみを開きます。あなたのデータベースを読み書きするために

DB_PATH = "/data/data/"+ context.getPackageName() + "/databases/"; 

、私の理解では、あなたがこの場所にデータベースをコピーする必要がありますということです。

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(); 

このコピーを行うためには、最初にする必要がありますデータベースファイルの最終的な宛先にデータベースを開く:

checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

は、ご質問があれば、私に教えてください

+0

このデータディレクトリはどこに保存されていますか?それが携帯電話のメモリにあり、SDカードではない場合は、データベースが電話のメモリには大きすぎるので、それは私には役に立たない。また、以前はSDカード上のこの4Trakディレクトリからデータベースを開くことができましたが、Androidアプリケーション自体で作成されました。 – Ogre

+0

データベースは "/ data/data /" + context.getPackageName()+ "/ databases /"に配置する必要があります。 sdCardを使用する場合は、独自のSQLiteOpenHelperを記述する必要があります。詳細はこちら[スレッド](http://groups.google.com/group/android-developers/browse_thread/thread/76b3f10269d0fbe0/1317ce60e25597b6?show_docid = 1317ce60e25597b6) –

1

これはちょうど私に起こりました。私は、「生産」とデバイス上にあり、SQLite DBにデータを持っているプログラムを書いていました。

このデータを(aSQLiteManagerを介して)SQL文の形式でバックアップしました。エミュレータでは、私はこのデータベースを再作成しました。

私はバージョン5のDBを期待していました。プログラムの最初のアクセスは、SQLiteOpenHelperのサブクラスのgetReadableDatabaseを使用して行いました。

そして、そこには、私は、この例外が発生しました:私はgetWritableDatabaseによってオープン呼び出しを置き換えることによってそれを固定5.

にバージョン0からの読み取り専用データベースをアップグレードすることはできません。

SQLiteヘルパーがCREATE TABLEステートメントを含むonCreateを呼び出したため、テーブルが既に存在していたため、別のエラーが発生したので、これは変です。私はonCreate全体をコメントアウトしなければならなかった。

関連する問題