0

Android アプリケーションで多くのテーブルを操作しているため、SQLite マネージャー (Firefox プラグインや sqlite の navicat など) でデータベース (DB) を作成することにしました。それらの作成を終了し、.sql ファイルをエクスポートします。しかし、このファイルの使い方がわかりません! もちろん、DB を (ルート化された電話で) ...data/data/{your package name}/ ..etc に配置するための投稿をいくつか見つけましたが、このステップの後に何をすべきかわかりません!! (Androidアプリにのみdbを導入するコードを知っています!!)

  • アプリケーションでこれらのメソッドを使用して作成したデータベースを使用する方法を段階的に教えてもらえますか??-

  • これらの SQLite マネージャーを使用するのは良い方法ですか、それとも Android でコードを使用して複数のテーブルを作成するのは複雑ですが、それを好みますか?

  • sqlite 2 と 3 の主な違いは何ですか? それらは異なる Android バージョンでサポートされていますか、それとも Sqlite の更新のみですか?

編集: dB を assest フォルダーにコピーし、それをコピーするためのコードを使用した後:

03-16 11:32:20.370: I/SqliteDatabaseCpp(3999): sqlite が返されました: エラー コード = 14、msg = [8609a15dfa] の 27712 行目でファイルを開けません、db=/data/data/com.androidhive.xmlparsing/データベース/surveydb.sqlite
03-16 11:32:20.370: I/SqliteDatabaseCpp(3999): sqlite が返されました: エラー コード = 14、msg = os_unix.c: 行 27712 の open() - "" errno=2 path=/data/data/com .androidhive.xmlparsing/databases/surveydb.sqlite、db=/data/data/com.androidhive.xmlparsing/databases/surveydb.sqlite
03-16 11:32:20.370: E/SqliteDatabaseCpp(3999): sqlite3_open_v2("/data/data/com.androidhive.xmlparsing/databases/surveydb.sqlite", &handle, 1, NULL) 失敗しました
03-16 11:32:20.380: E/SQLiteDatabase(3999): データベースのオープンに失敗しました。それを閉じます。
03-16 11:32:20.380: E/SQLiteDatabase(3999): android.database.sqlite.SQLiteCantOpenDatabaseException: データベース ファイルを開けません
03-16 11:32:20.380: E/SQLiteDatabase(3999): android.database.sqlite.SQLiteDatabase.dbopen(ネイティブ メソッド) で
03-16 11:32:20.380: E/SQLiteDatabase(3999): android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983) で
03-16 11:32:20.380: E/SQLiteDatabase(3999): android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956) で
03-16 11:32:20.380: E/SQLiteDatabase(3999): android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:932) で
03-16 11:32:20.380: E/SQLiteDatabase (3999): database.AssetDatabaseHelper.checkExist (AssetDatabaseHelper.java:55) で
03-16 11:32:20.380: E/SQLiteDatabase (3999): database.AssetDatabaseHelper.importIfNotExist (AssetDatabaseHelper.java:81) で
03-16 11:32:20.380: E/SQLiteDatabase (3999): com.androidhive.xmlparsing.AndroidXMLParsingActivity.onCreate (AndroidXMLParsingActivity.java:78) で
03-16 11:32:20.380: E/SQLiteDatabase (3999): android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1050) で
03-16 11:32:20.380: E/SQLiteDatabase (3999): android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1782) で
03-16 11:32:20.380: E/SQLiteDatabase (3999): android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:1834) で
03-16 11:32:20.380: E/SQLiteDatabase(3999): android.app.ActivityThread.access$500 で (ActivityThread.java:122)
03-16 11:32:20.380: E/SQLiteDatabase(3999): android.app.ActivityThread$H.handleMessage(ActivityThread.java:1027) で
03-16 11:32:20.380: E/SQLiteDatabase(3999): android.os.Handler.dispatchMessage(Handler.java:99) で
03-16 11:32:20.380: E/SQLiteDatabase(3999): android.os.Looper.loop(Looper.java:132)
03-16 11:32:20.380: E/SQLiteDatabase(3999): android.app.ActivityThread.main(ActivityThread.java:4126) で
03-16 11:32:20.380: E/SQLiteDatabase(3999): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) で
03-16 11:32:20.380: E/SQLiteDatabase(3999): java.lang.reflect.Method.invoke(Method.java:491) で
03-16 11:32:20.380: E/SQLiteDatabase(3999): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) で
03-16 11:32:20.380: E/SQLiteDatabase (3999): com.android.internal.os.ZygoteInit.main (ZygoteInit.java:602) で
03-16 11:32:20.380: E/SQLiteDatabase(3999): dalvik.system.NativeStart.main (ネイティブ メソッド) で
03-16 11:32:20.380: W/System.err(3999): android.database.sqlite.SQLiteCantOpenDatabaseException: データベース ファイルを開けません
03-16 11:32:20.380: W/System.err(3999): android.database.sqlite.SQLiteDatabase.dbopen (ネイティブ メソッド) で
03-16 11:32:20.380: W/System.err(3999): android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983) で
03-16 11:32:20.380: W/System.err(3999): android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956) で
03-16 11:32:20.380: W/System.err(3999): android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:932) で
03-16 11:32:20.380: W/System.err(3999): database.AssetDatabaseHelper.checkExist (AssetDatabaseHelper.java:55) で
03-16 11:32:20.380: W/System.err (3999): database.AssetDatabaseHelper.importIfNotExist (AssetDatabaseHelper.java:81) で
03-16 11:32:20.380: W/System.err(3999): com.androidhive.xmlparsing.AndroidXMLParsingActivity.onCreate (AndroidXMLParsingActivity.java:78) で
03-16 11:32:20.380: W/System.err(3999): android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1050) で
03-16 11:32:20.380: W/System.err(3999): android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1782) で
03-16 11:32:20.380: W/System.err(3999): android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:1834) で
03-16 11:32:20.380: W/System.err(3999): android.app.ActivityThread.access$500 (ActivityThread.java:122) で
03-16 11:32:20.380: W/System.err(3999): android.app.ActivityThread$H.handleMessage (ActivityThread.java:1027) で
03-16 11:32:20.380: W/System.err(3999): android.os.Handler.dispatchMessage(Handler.java:99) で
03-16 11:32:20.380: W/System.err(3999): android.os.Looper.loop(Looper.java:132)
03-16 11:32:20.380: W/System.err(3999): android.app.ActivityThread.main (ActivityThread.java:4126) で
03-16 11:32:20.380: W/System.err(3999): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) で
03-16 11:32:20.380: W/System.err(3999): java.lang.reflect.Method.invoke(Method.java:491) で
03-16 11:32:20.380: W/System.err(3999): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) で
03-16 11:32:20.380: W/System.err(3999): com.android.internal.os.ZygoteInit.main (ZygoteInit.java:602) で
03-16 11:32:20.380: W/System.err(3999): dalvik.system.NativeStart.main (ネイティブ メソッド) で

私はこのコードを使用しました:

public class AssetDatabaseHelper extends SQLiteOpenHelper{

 private String dbName;
    private String db_path;
    private Context context;

    /**
     * A helpe r class to import db files.
     * 
     * @param context
     *  base/app context
     * @param dbName
     *            The name of the db in asset folder .
     */
    public AssetDatabaseHelper(Context context, String dbName) {
        super(context, dbName, null, 1);
        this.dbName = dbName;
        this.context = context;
        db_path = "/data/data/" + context.getPackageName() + "/databases/";
    }

    /**
     * Check if the database already exist to avoid re-copying the file each
     * time you open the application.
     * 
     * @return true if it exists, false if it doesn't
     */
    public boolean checkExist() {

        SQLiteDatabase checkDB = null;

        try {
            String myPath = db_path + dbName;
            checkDB = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READONLY);

        } catch (SQLiteException e) {
            e.printStackTrace();


        } catch (Exception ep) {
            ep.printStackTrace();
        }

        if (checkDB != null) {

            checkDB.close();

        }

        return checkDB != null ? true : false;
    }

    /**
     * Creates a empty database on the system and rewrites it with your own
     * database.
     * */
    public void importIfNotExist() throws IOException {

        boolean dbExist = checkExist();

        if (dbExist) {
            // do nothing - database already exist
        } else {
            this.getReadableDatabase();

            try {

                copyDatabase();

            } catch (IOException e) {

                throw new Error("Error copying database");

            }
        }

    }
    /**
     * Creates copies the database from asset to the new database location.
     * */
    private void copyDatabase() throws IOException {
        InputStream is = context.getAssets().open(dbName);

        OutputStream os = new FileOutputStream(db_path + dbName);

        byte[] buffer = new byte[4096];
        int length;
        while ((length = is.read(buffer)) > 0) {
            os.write(buffer, 0, length);
        }
        os.flush();
        os.close();
        is.close();
        this.close();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }


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


}

更新 2: db sCRIPTS:

CREATE TABLE "**" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "**" TEXT, "****" INTEGER);
CREATE TABLE "***" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "***" INTEGER UNIQUE , "***" TEXT);
CREATE TABLE "**" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "***" INTEGER UNIQUE , "**" INTEGER, "**" INTEGER, "**" TEXT, "impGender" TEXT, "* *" TEXT, "***" INTEGER, "***" DATETIME DEFAULT CURRENT_TIMESTAMP);
CREATE TABLE "**" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "**" TEXT);
CREATE TABLE "**" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "***" INTEGER UNIQUE , "***" TEXT, "srQType" INTEGER, "***" INTEGER, "**" BOOL, "**" FLOAT, "**" FLOAT, "**" INTEGER, "**" UNIQUE );
CREATE TABLE "*" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "**" INTEGER NOT NULL UNIQUE , "***" INTEGER, "**" INTEGER, "**" INTEGER, "**" INTEGER, "**" TEXT, "**" TEXT);
CREATE TABLE "**" ("_id" INTEGER PRIMARY KEY, "***" TEXT);
CREATE TABLE "**" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "**" TEXT, "srDesc" TEXT, "***" INTEGER, "**" DATETIME, "**" DATETIME, "** **" INTEGER、"srCode" INTEGER);
CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US');

そして最後に:

new AssetDatabaseHelper(this , "surveydb.sqlite").importIfNotExist();

何が問題ですか?

手伝って頂けますか?

4

1 に答える 1

2
  • Sqlite 3 は Android でサポートされています。
  • インポートされたデータベースを使用するためにルート化された電話は必要ありません

インポートされたデータベースを使用する手順:

  1. データベースを /assets フォルダーにダンプします。
  2. ここに git ハブからコードを追加します
  3. 以下のコードを実行して、データベースをインポートします。

        AssetDatabaseHelper dbHelper = new AssetDatabaseHelper(
            getBaseContext(), YOUR_DATABASE_NAME);
    try {
        dbHelper.importIfNotExist();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
于 2013-03-13T16:51:49.273 に答える