2011-07-17 10 views
1

私は、あらかじめデータベースを持っているアンドロイドアプリケーションを構築するのに本当に問題があります。あらかじめデータベースが設定されています - Androidアプリケーション

source codeをご覧ください。

sqlitebrowserを使用してデータベースを作成し、Androidアプリケーションの「assets」ディレクトリにコピーしました。

私はMainActivity.javaでJavaクラスDBAdapter.java

に資産ディレクトリからデータベースをコピーするコードを追加して、私はデータベースが存在しないので、もしそれが資産ディレクトリからデータベースをコピーする必要がありcreateDatabase関数を呼び出しました。データベースを作成したら、getAllContacts関数を呼び出してページに表示します。

私はプロジェクトを実行するたびに、私はデバッグできないエラーを投げます。

誰でも問題を解決するために私を助けてください。

UPDATE:

Logcatは、次の例外を示しています。アセット/ MyDB.dbの「連絡先」テーブルはコピー/作成されていないようですが、理由はわかりません。

E/AndroidRuntime( 672): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.me.mydb/org.me.mydb.MainActivity}: android.database.sqlite.SQLiteException: no such table: contacts: , while compiling: SELECT _id, name, email FROM contacts 
E/AndroidRuntime( 672):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
E/AndroidRuntime( 672):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
E/AndroidRuntime( 672):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
E/AndroidRuntime( 672):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
E/AndroidRuntime( 672):  at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime( 672):  at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime( 672):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
+0

logcatはこれについて言わない何...? – Necronet

+0

ログはどこに表示されますか?申し訳ありませんが、Androidの初心者です – Peter

+0

コンソールで手動で確認する必要がありますhttp://developer.android.com/guide/developing/tools/logcat.html ADTを使用する場合、ログを表示するにはLogcatビューが付属しています – Necronet

答えて

0

よくDataHelperにはonCreateメソッドが付属していますので、そこにデータベースを作成することもできます。データベースが初めて作成されたときに呼び出され

Official Android documentation

。これは、 テーブルの作成とテーブルの最初の人口は になるはずです。実際に

あなたは方法

@Override 
     public void onCreate(SQLiteDatabase db) 
     { 

     } 
+0

Yeaaaah私はそれがonCreate関数を使ってデータベースを作成することは可能であることを知っている...しかし何百/何千もの行がすでに作成されているならデータベースファイルには?? Androidのサンプルとチュートリアルのほとんどは、Web上にあり、実行時にデータベースを作成して埋め込みます...私はAndroidアプリケーションを使用して独立したプリロードされたデータベースを作成することができるサンプル/チュートリアルを探しています。 私のコードの問題点を教えてください。 – Peter

0

は私がのonCreateイベント処理および* .SQLスクリプトのセット(実行ライン・バイ・ラインの単純なループで)を使用することをオーバーライドをhaved。

これは、データベース更新ルーチンも作成する必要がある場合に便利です。私は新しい(最新の)データベースとデータベースの古いバージョンごとのSQLスクリプトのセットを初期化するための1つのSQLスクリプトを持っています。

新しいデータベースを初期化する必要があるときはいつでも、「create」SQLスクリプトが呼び出されます。バージョンからデータベースを更新する必要がある場合は常に、スクリプト「v1-update-to-v2」および「v2-update-v3」が呼び出されます。 1からバージョン3へのアップグレードは、バージョンごとに単一のアップデートスクリプト(「v1-update-to-v3」や「v2-update-to-v3」など)よりも遅くなりますが、新しいバージョンを追加すると、 (私は古いスクリプトでは何も変更する必要はありません)。

+0

ソースコードを共有することは可能でしょうか? – Peter

2

ここでは、あなたの仕事を始めるには良いlinkです。

基本的にはSQLiteOpenHelperクラスを使用し、データベースが存在しない場合は、事前にシードされたバイトのデータベースバイトを正しい場所にコピーします。私はわずかに変更された私のプロジェクトでそれを持っているが、動作します

+0

私もこの実装を使用し、それをお勧めします。しかし、時にはそれは少しばかばかしいかもしれませんし、データベース全体を適切にコピーしないので、あなたのアプリのどこかで大丈夫だと確認してください。 –

+0

@ Paul.s私はリンクで与えられた同じ手順に従った。しかしそれはうまくいきませんでした。あなたが私のコードをデバッグして、どこに問題があるのか​​を教えてもらえれば素晴らしいでしょう。 – Peter

+0

@Espiandev私は作業コード/プロジェクトを送ってもらえますか? – Peter

0

次のコードでcopyDBFromResource();を言うライン置き換えうまく動作するように見える - 私はこれが必要になると思います

 SQLiteDatabase readDB = null; 
     readDB = this.getReadableDatabase(); 
     readDB.close(); 
     readDB = null; 
     copyDBFromResource(); 

をあなたのコードは、それ自体ができないためデータフォルダにファイルを作成し、getReadableDatabase()を呼び出すとそこにdbファイルが作成されます。アンドロイド2.2以降では、ハンドルを取得した後にデータベースを閉じる必要があります。そうしないと、コピーは成功しません。

編集:

それはまだ動作しない場合は、次のように書き込み外部ストレージのアクセス許可を与えてみてください -

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

ありがとうございましたが、うまくいきませんでした:( – Peter

+0

上記の編集で説明したように、WRITE_EXTERNAL_STORAGE権限を(マニフェストのアプリケーションノードの直後に)与えますか? –

+0

@Abinav はどこに追加すればよいですか? 翔uld AndroidManifest.xmlに追加しますか? – Peter

関連する問題