3

アセット フォルダーのデータベースを内部アプリ メモリにコピーしようとしました。

データベースには 2 つのテーブルが含まれています。1 つのテーブルは完全に空であり、ユーザーがデータをテーブルに挿入できるようにする必要があります。別のテーブルには、アプリの情報を提供するデータがプリロードされています (プリロードされたデータベースをアプリにロードする必要がある理由) プリロードされたデータベースを扱っていたときに、データベースがアプリのメモリは問題ありませんが、何らかの理由で、その余分なテーブルのためにそうできませんでした。

内部に android-metadata がないため、アセットに配置した DB が破損している可能性はありますか? アセット フォルダーのデータベースは、CSV シートのデータを使用して作成されたばかりです。

この問題の前に、パッケージ名を屈折させ、マニフェストでも変更しました。問題の一つではないでしょうか?

コードはこちら

DBHelper.class

@Override
public void onCreate(SQLiteDatabase db)
{
    db.execSQL(DB_CREATE_SQL);
    db.execSQL(DB_CREATE_SQL_FOR_GAME);
}
    public void createDatabase(Context context) throws IOException
{
    Log.d("Create Database","In method");
    // If database does not exist, copy it from the asset
    if (checkDatabase() == false)
    {
        try
        {
            // Copy the database from assets
            copyDatabase(context);
            Log.d("Create Database","Copying");
        }
        catch (IOException mIOException)
        {
            Log.d("Create Database","Failed");
            throw new Error("ErrorCopyingDataBase");
        }
    }
}


public void copyDatabase(Context context) throws IOException
{
    // Open your local db as the input stream
    InputStream myInput = context.getAssets().open(DB_NAME);

    // Path to the just created empty db
    String outFileName = DB_PATH + DB_NAME;

    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    // transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[10240];
    int length;
    while ((length = myInput.read(buffer)) > 0)
    {
        myOutput.write(buffer, 0, length);
    }
    // Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();
}

public boolean checkDatabase()
{

    String myPath = DB_PATH + DB_NAME;
    File f = new File(myPath);
    return f.exists();
}

アプリが起動された直後にアセットを実際に入力しているため、アプリを実行するたびに実際に IO 例外が発生します。

ログキャット

09-25 16:55:42.878: E/SQLiteDatabase(28815): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
09-25 16:55:42.878: E/SQLiteDatabase(28815):    at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
09-25 16:55:42.878: E/SQLiteDatabase(28815):    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:278)
09-25 16:55:42.878: E/SQLiteDatabase(28815):    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:217)
09-25 16:55:42.878: E/SQLiteDatabase(28815):    at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:464)
09-25 16:55:42.878: E/SQLiteDatabase(28815):    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:186)
09-25 16:55:42.878: E/SQLiteDatabase(28815):    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:178)
09-25 16:55:42.878: E/SQLiteDatabase(28815):    at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)
09-25 16:55:42.878: E/SQLiteDatabase(28815):    at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)
09-25 16:55:42.878: E/SQLiteDatabase(28815):    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
09-25 16:55:42.878: E/SQLiteDatabase(28815):    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)

getWritableDatabase() を使用してデータベースのパスを作成した後、データベースをフォルダーにコピーしようとしました (既存のパスを上書きすることを意味します)。このエラーが発生しました

09-26 11:09:46.370: E/System(2444): Uncaught exception thrown by finalizer
09-26 11:09:46.380: E/System(2444): java.io.IOException: close failed: EIO (I/O error)
09-26 11:09:46.380: E/System(2444):     at libcore.io.IoUtils.close(IoUtils.java:41)
09-26 11:09:46.380: E/System(2444):     at java.io.RandomAccessFile.close(RandomAccessFile.java:166)
09-26 11:09:46.380: E/System(2444):     at java.io.RandomAccessFile.finalize(RandomAccessFile.java:175)
09-26 11:09:46.380: E/System(2444):     at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:186)
09-26 11:09:46.380: E/System(2444):     at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:169)
09-26 11:09:46.380: E/System(2444):     at java.lang.Thread.run(Thread.java:856)
09-26 11:09:46.380: E/System(2444): Caused by: libcore.io.ErrnoException: close failed: EIO (I/O error)
09-26 11:09:46.380: E/System(2444):     at libcore.io.Posix.close(Native Method)
09-26 11:09:46.380: E/System(2444):     at libcore.io.BlockGuardOs.close(BlockGuardOs.java:75)
09-26 11:09:46.380: E/System(2444):     at libcore.io.IoUtils.close(IoUtils.java:38)
09-26 11:09:46.380: E/System(2444):     ... 5 more
4

3 に答える 3

0

データベースにアクセスする前にこれを試してください。

            InputStream input = getResources().getAssets().open("db");
            File f = new File("DB_PATH/databases");
            if (f.mkdirs())
            {
                File ff=new File("DB_PATH/databases");
                FileOutputStream output = new FileOutputStream(ff);
                int data = 0;
                byte[] buffer = new byte[1024];
                while ((data = input.read(buffer)) > 0) {
                    output.write(buffer, 0, data);
                }

                input.close();
                output.close();
                Log.d("File", "File Copied!");
            } else {
                Log.d("File", "AlreadyExists!");
            }
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
于 2013-09-25T04:42:32.950 に答える