微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 无法将db’/data/data/my.easymedi.controller/databases/EasyMediInfo.db’的区域设置更改为“en_US”

在我的 Android应用程序中有一个预定义的数据库,它位于assets文件夹中.我创建了一个表的android_Metadata,带有一个名为locale的列,并有一个记录en_US.在我的应用程序中,用户应该输入他/她的详细信息,然后点击保存按钮.当点击保存按钮时,我收到以下错误.
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

我的DBHelper类正在关注.

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,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,sqliteDatabase.NO_LOCALIZED_COLLATORS);
    } catch (sqliteException e) {
        Toast.makeText(myContext,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,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,values);
        Log.d("INSERT","information Saved");
        return true;
    } catch (Exception e) {
        // Todo Auto-generated catch block
        Log.d("INSERT",e.toString());
        return false;
    }
}
}

这是我的代码段保存按钮.

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;

在我的主要活动中,我通过调用这个代码段创建了数据库.

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

如果任何人能够如此善于解释这个错误是什么,我将是非常有义务的.

Thanx提前

解决方法

您的copyDataBase()函数从资产文件夹中复制数据库(EasyMediInfo.db).而且看起来数据库是使用与’en_US’不同的语言环境创建的.

编辑

尝试更改:

myDatabase = sqliteDatabase.openDatabase(myPath,sqliteDatabase.OPEN_READWRITE);

至:

myDatabase = sqliteDatabase.openDatabase(myPath,sqliteDatabase.NO_LOCALIZED_COLLATORS | sqliteDatabase.OPEN_READWRITE);

原文地址:https://www.jb51.cc/java/125837.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐