Fehler beim Ändern des Gebietsschemas für db '/data/data/my.easymedi.controller/databases/EasyMediInfo.db' in 'en_US'

In meiner Android-Anwendung gibt es eine vordefinierte Datenbank, die sich im Assets-Ordner befindet. Ich habe eine Tabelle android_metadata mit einer Spalte namens locale und mit einem Datensatz en_US erstellt. In meiner Anwendung sollte der Benutzer seine / ihre Daten eingeben und auf die Schaltfläche Speichern klicken. Beim Klicken auf den Speichern-Button ist folgende Fehlermeldung aufgetreten.

10-21 09:37:06.010: E/SQLiteLog(6278): (11) database corruption at line 50741 of       [00bb9c9ce4]
10-21 09:37:06.010: E/SQLiteLog(6278): (11) database corruption at line 50780 of [00bb9c9ce4]
10-21 09:37:06.010: E/SQLiteLog(6278): (11) statement aborts at 16: [SELECT locale FROM android_metadata UNION SELECT NULL ORDER BY locale DESC LIMIT 1] 
10-21 09:37:06.160: E/SQLiteDatabase(6278): Failed to open database '/data/data/my.easymedi.controller/databases/EasyMediInfo.db'.
10-21 09:37:06.160: E/SQLiteDatabase(6278): android.database.sqlite.SQLiteException:   Failed to change locale for db '/data/data/my.easymedi.controller/databases /EasyMediInfo.db' to 'en_US'.
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:386)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:218)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at my.easymedi.db.DBHelper.openDataBase(DBHelper.java:153)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at my.easymedi.controller.AddNewPerson.onClick(AddNewPerson.java:202)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.view.View.performClick(View.java:4202)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.view.View$PerformClick.run(View.java:17340)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.os.Handler.handleCallback(Handler.java:725)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.os.Looper.loop(Looper.java:137)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.app.ActivityThread.main(ActivityThread.java:5039)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at java.lang.reflect.Method.invokeNative(Native Method)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at java.lang.reflect.Method.invoke(Method.java:511)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at dalvik.system.NativeStart.main(Native Method)
10-21 09:37:06.160: E/SQLiteDatabase(6278): Caused by: android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed (code 11)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.database.sqlite.SQLiteConnection.nativeExecuteForString(Native Method)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:634)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:367)
10-21 09:37:06.160: E/SQLiteDatabase(6278):     ... 22 more

Meine DBHelper-Klasse folgt.

package my.easymedi.db;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import my.easymedi.entity.Person;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;

public class DBHelper extends SQLiteOpenHelper {

private static final String pkg = "my.easymedi.controller";
private static String DB_PATH = "";
private static String DB_NAME = "EasyMediInfo.db";
private static final int DB_VERSION = 1;
private final Context myContext;
private SQLiteDatabase myDatabase;

public DBHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
    // this.myContext = context;
    if (android.os.Build.VERSION.SDK_INT >= 4.2) {
        DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
    } else {
        DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
    }
    this.myContext = context;
}

public void createDataBase() {
    boolean dbExist = checkDataBase();
    System.out.println("==="+dbExist+"===");
    if (dbExist) {
        // do nothing - database already exist
    } else {

        this.getReadableDatabase();
        this.close();
        try {
            copyDataBase();
            Log.d("CREATE_DB", "createDatabase database created");
        } catch (IOException e) {
            Toast.makeText(myContext, e.getMessage(), Toast.LENGTH_SHORT)
                    .show();
            Log.d("CREATE_DB", e.getMessage());
        }
    }
}

private void copyDataBase() throws IOException {
    System.out.println("***copy db***");
    InputStream databaseInput = null;
    /* Path to copy the database */
    String outFileName = DB_PATH + DB_NAME;
    /* open the empty database as an output stream */
    OutputStream databaseOutput = new FileOutputStream(outFileName);
    /* open the local database as the input stream */
    databaseInput = myContext.getAssets().open(DB_NAME);

    /* Transfer byte from byte from input file to output file */
    byte[] buffer = new byte[1024];
    int length = databaseInput.read(buffer);
    while (length > 0) {
        databaseOutput.write(buffer, 0, length);
        //databaseOutput.flush();
    }
    databaseOutput.flush();
    databaseInput.close();
    databaseOutput.close();
}

private boolean checkDataBase() {
    File dbFile = new File(DB_PATH + DB_NAME);
    return dbFile.exists();
    /*SQLiteDatabase checkDB = null;
    try {
        String myPath = DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    } catch (SQLiteException e) {
        Toast.makeText(myContext, e.getMessage(), Toast.LENGTH_SHORT)
                .show();
        Log.d("Check_DB", e.getMessage());
    }
    if (checkDB != null) {
        String str = "checked";
        System.out.println("====" + str + "====");
        checkDB.close();
    }
    return checkDB != null ? true : false;*/
}

/* Open the database */
public boolean openDataBase() {
    String myPath = DB_PATH + DB_NAME;
    Toast.makeText(myContext, myPath, Toast.LENGTH_SHORT).show();
    myDatabase = SQLiteDatabase.openDatabase(myPath, null,
            SQLiteDatabase.OPEN_READWRITE);
    if (myDatabase != null) {
        System.out.println("====database opened====");
    } else {
        System.out.println("====error opening database====");
    }
    return myDatabase != null ? true : false;
}

public void closeDatabase() {
    if(myDatabase != null){
        myDatabase.close();
    }
}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

}

public boolean insertIntoDatabase(String table, ContentValues values) {
    try {
        myDatabase.insert(table, null, values);
        Log.d("INSERT", "Information Saved");
        return true;
    } catch (Exception e) {
        // TODO Auto-generated catch block
        Log.d("INSERT", e.toString());
        return false;
    }
}
}

Und das ist mein Codesegment für die Schaltfläche Speichern.

case R.id.btnSave:
        personName = etName.getText().toString();
        date_of_birth = tvDOB.getText().toString();
        age = tvAge.getText().toString();

        int selected_rb_ID = genderGrp.getCheckedRadioButtonId();   
        RadioButton rb = (RadioButton) findViewById(selected_rb_ID);
        gender = rb.getText().toString();
        bloodGrp = spiBloodGrp.getSelectedItem().toString();

        Person person = new Person();
        person.setName(personName);
        person.setDate_of_birth(date_of_birth);
        person.setAge(age);
        person.setGender(gender);
        person.setBloodGrp(bloodGrp);

        ContentValues values = new ContentValues();
        values.put(COLUMN_PERSON_NAME, person.getName());
        values.put(COLUMN_DOB, person.getDate_of_birth());
        values.put(COLUMN_AGE, person.getAge());
        values.put(COLUMN_GENDER, person.getGender());
        values.put(COLUMN_BLOODGRP, person.getBloodGrp());

        DBHelper dbHelper = new DBHelper(this);
        dbHelper.createDataBase();
        dbHelper.openDataBase();
        if(dbHelper.insertIntoDatabase("EMPerson", values)){
            Toast.makeText(getApplicationContext(), "Data has been saved successfully", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(getApplicationContext(), "Oops ! Try again", Toast.LENGTH_SHORT).show();
        }
        dbHelper.closeDatabase();

        break;

In meiner Hauptaktivität habe ich die Datenbank durch Aufrufen dieses Codesegments erstellt.

final DBHelper helper = new DBHelper(this);
helper.createDataBase();

Ich wäre sehr dankbar, wenn jemand so freundlich sein könnte, um zu erklären, was der Fehler dabei ist.

Vielen Dank im Voraus

Antworten auf die Frage(2)

Ihre Antwort auf die Frage