java - 无法将 db '/data/data/my.easymedi.controller/databases/EasyMediInfo.db' 的区域设置更改为 'en_US'

标签 java android sqlite

在我的 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 类(class)正在关注;

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;
  }
 }
}

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

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;

在我的主要 Activity 中,我通过调用此代码段创建了数据库。

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

这个错误是什么意思,我该如何解决?

最佳答案

您的 copyDataBase() 函数从 assets 文件夹复制一个 db(EasyMediInfo.db)。而且似乎数据库是使用与 'en_US' 不同的语言环境创建的。

编辑

尝试改变:

myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);

收件人:

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

关于java - 无法将 db '/data/data/my.easymedi.controller/databases/EasyMediInfo.db' 的区域设置更改为 'en_US',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19491675/

相关文章:

java - 如何将大字体的 LabelField 居中

java - 在 Java 中获取按钮输入

java - 脏检查 : JSF + Primefaces application?

Android - 拆分可绘制对象

javascript - 多次触发事务回调

java - Java ufo 游戏中的碰撞检测

android - 发布 apk 中的 Firebase IllegalAccessException

android - 如何从 build.gradle 中的 json 配置文件创建 ProductFlavors?

sqlite - 类型转换问题

真空后 SQLite 数据库变大