0

編集:明確にするために以前のコードを削除しました

提案に基づいて、ログ メッセージを追加して、停止している場所を確認しました。

への呼び出しを適切にスローしているように見えますがcheckDatabase()、データベースをコピーするために戻っていません。これは私のcheckDatabase()方法です:

File dbFile = new File(DB_PATH + DB_NAME);
        if(dbFile.exists()){
            Log.d("True","Returned true");
            return true;

        }else{
            dbFile.getParentFile().mkdirs();
            Log.d("CreatedPath","Made the right directory");
            return false;
        }

デバッグ ログに「作成されたパス」メッセージが表示されます。それでそこまで進んでいます。

次に、false を返します。これにより、次のこと開始されます。

public void createDataBase() throws IOException{

        boolean dbExist = checkDatabase();
        if (!dbExist){

            this.getReadableDatabase();

            // Calling this method an empty database will be
            // created into the default system path of 
            // the app so we can overwrite with FirstDB.


            try{

                copyDatabase();

            }catch (IOException e) {
                throw new Error("Error copying database");

            }
        }
    }

ただし、これらのログ メッセージはまったく表示されません。false を返し、そのまま動き続けるようなものです。

createDataBase()もう一度電話する必要がありますか?

4

2 に答える 2

1

デバイスからアプリをアンインストールして再試行し/databases/ますが、 DB_PATH.

private static String DB_PATH = "/data/data/com.example.mydbapp/databases/";

私が知っている限り、それは常にそこにあるはずであり、あなたのcreateDatabase方法には表示されません。

後で sqlite3 経由でアクセスして、正しく作成されているかどうかを確認してください。

ドキュメントによると

sqlite3 を使用するには、上記のようにエミュレータ インスタンスでリモート シェルに入り、sqlite3 コマンドを使用してツールを呼び出します。必要に応じて、sqlite3 を呼び出すときに、探索するデータベースへのフル パスを指定できます。エミュレーター/デバイス インスタンスは、SQLite3 データベースをフォルダー/data/data/< package_name >/databases/に格納します。

次に例を示します。

adb -s emulator-5554 shell
# sqlite3 /data/data/com.example.mydbapp/databases/FirstDB.db`
于 2013-07-10T20:57:51.693 に答える