4

私はアンドロイドアプリケーションで DataBaseHelper として次のコードを持っています:

    public class DbUtils {

    private static final String DB_PATH = "/data/data/com.project.skcompanion/databases/";

    private static final String DB_NAME = "basesh.sqlite";



    public static void createDatabaseIfNotExists(Context context) throws IOException {
        Log.d("check1", "check1");
        boolean createDb = false;

        File dbDir = new File(DB_PATH);

        File dbFile = new File(DB_PATH + DB_NAME);

        if (!dbDir.exists()) {
            dbDir.mkdir();
            createDb = true;
        }
        else if (!dbFile.exists()) {
            createDb = true;
        }
        else {
            // Check that we have the latest version of the db
            boolean doUpgrade = false;

            if (doUpgrade) {
                dbFile.delete();
                createDb = true;
            }
        }
        Log.d("check2", "check2");
        if (createDb) {
            Log.d("check3", "check3");
            // Open your local db
            AssetManager am = context.getAssets();
            InputStream myInput = am.open(DB_NAME);
            Log.d("check4", "check4");
            // Open the empty db
            OutputStream myOutput = new FileOutputStream(dbFile);
            // transfer bytes from the inputfile to the 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 static SQLiteDatabase getStaticDb() {

        return SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);

    }

しかし、コードが basesh.sqlite を開こうとすると、FileNotFoundException が送信されます。assets/databases に basesh.sqlite ファイルがあります。いくつかのデバッグの後、問題はこの行にあると思います。

InputStream myInput = am.open(DB_NAME);

しかし、なぜそれが私のファイルを開かないのか分かりません。前もって感謝します。

4

3 に答える 3

0

ファイル自体を作成する必要はありません。データベースを作成するだけで作成されます。

このヘルパーを試してください:

public class DatabaseHelper extends SQLiteOpenHelper {

    private final Context context;

    public DatabaseHelper(Context context) {
        super(context, context.getString(R.string.app_name), null, Integer.valueOf(context.getString(R.string.database_version)));
        this.context = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        createDb(db);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String[] versions = context.getResources().getStringArray(R.array.database_upgrade);
        for (int i = oldVersion; i < newVersion; i++) {
            String[] statements = versions[i - 1].split(";");
            for (String statement : statements) {
                db.execSQL(statement);
            }
        }
    }

    private void createDb(SQLiteDatabase db) {
        try {
            db.beginTransaction();
            String[] tables = context.getResources().getStringArray(R.array.database_tables);
            for (String table : tables) {
                db.execSQL(table);
            }
        } catch (SQLException e) {
            Log.e(context.getString(R.string.app_name), context.getString(R.string.database_access_error));
        } finally {
            db.endTransaction();
        }
    }
}

また、構造を更新するデータベースの新しいバージョン番号を含むリソースについては、次のようになります。

<string name="database_version">2</string>

<string-array name="database_tables">
    <item>CREATE TABLE "COLLECT" (
        _ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
        DATE TEXT NOT NULL,
        SENT INTEGER, 
        OM REAL,
        CMSR REAL,
        DC REAL
        );</item>
</string-array>
<string-array name="database_upgrade">
    <item>ALTER TABLE COLLECT ADD COLUMN SENT INTEGER;</item>
</string-array>

ご覧のとおりdatabase_version、1 のとき、sqliteHelper はcollect私の例のようにテーブルを作成するだけです。例のようにデータベースが既に存在し、バージョン番号が現在 2 以上の場合、sqliteHelper は配列を読み取って db 構造を更新し、database_upgradeそのすべての項目を繰り返します。

于 2013-03-28T02:25:31.587 に答える
0

問題は、データベース ファイル basesh.sqlite を に配置したことですがassets/databases、これは間違っています。context.getAssets().open("basesh.sqlite") を調べてassetsも何も見つかりません。そのため、代わりに下に配置する必要がありますassets

于 2013-03-28T02:04:52.990 に答える
0

開こうとしています

InputStream myInput = am.open(DB_NAME);

データベースを作成したときは、このパスに作成します

private static final String DB_PATH = "/data/data/com.project.skcompanion/databases/";

コードをこれに更新します

InputStream myInput = am.open(DB_PATH+DB_NAME);
于 2013-03-28T02:09:09.150 に答える