在我的Android应用程序中,资产文件夹中有一个预定义的数据库。
我创建了一个表android_metadata
,该表的列名为locale
并且有一条记录en_US
。
在我的应用程序中,用户应输入他/她的详细信息,然后单击“保存”按钮。
当单击保存按钮时,出现以下错误;
10-21 09:37:06.010:E / SQLiteLog(6278):(11)数据库损坏,位于[00bb9c9ce4]的第50741行10-21
09:37:06.010:E / SQLiteLog(6278):(11)数据库损坏[00bb9c9ce4]的第50780行10-21
09:37:06.010:E / SQLiteLog(6278):(11)语句在16:中止。 37:06.160:E /
SQLiteDatabase(6278):无法打开数据库’/data/data/my.easymedi.controller/databases/EasyMediInfo.db’。10-21
09:37:06.160:E /
SQLiteDatabase(6278):android.database.sqlite.SQLiteException:无法将db’/data/data/my.easymedi.controller/databases/EasyMediInfo.db’的语言环境更改为’
en_US’。10-21 09:37:06.160:E /
SQLiteDatabase(6278):位于android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:
我的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, 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;
在我的主要活动中,我通过调用此代码段来创建数据库。
final DBHelper helper = new DBHelper(this);
helper.createDataBase();
该错误的含义是什么,我该如何解决?
您的copyDataBase()
函数EasyMediInfo.db
从资产文件夹复制db()。看来数据库是使用不同于的语言环境创建的'en_US'
。
编辑
尝试更改:
myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
至:
myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.OPEN_READWRITE);
问题内容: 我在Edittext的addTextChangedListener方法中已自定义,一切正常,但是当我更改语言(语言环境)时,我的addTextChangedListener无法正常工作。 我搜索了我的问题并找到了解决方案: 但我不知道如何使用此代码。 问题答案: 您可以尝试先转换为,然后将其投射到
q语言有许多不同的方式来表示和操纵时间数据,例如时间和日期。 Date kdb +中的日期在内部存储为自我们的参考日期为01Jan2000以来的整数天数。 此日期之后的日期在内部存储为正数,之前的日期作为负数引用。 默认情况下,日期以“YYYY.MM.DD”格式写入 q)x:2015.01.22 /This is how we write 22nd Jan 2015 q)`int$x
我有下面的代码,首先检查记录,如果找到,删除该记录并刷新对数据库的更改。但是,当我调试时,我看到当调试器点击下一个代码块时,它没有反映对数据库的更改()。 那么,这种做法错在哪里呢?
问题内容: 我有一个Spring应用程序,希望用户能够更改首选语言环境。当前,用户可以更改当前会话的语言环境,但是我希望能够保存users选项,以便每当他们登录时,使用已保存的语言环境(如果存在)。我有一个mysql数据库,用于存储用户区域设置首选项。我创建了一个自定义AuthenticationSuccessHandler,以处理将语言环境更改为已保存的语言环境的操作,该方法适用于已将语言环境保
Rexx能够使用下面列出的各种数据库。 HSQLDB Oracle SQL Server MySQL MongoDB 单击以下链接后,可以找到Rexx数据库的所有信息 - https://rexxsql.sourceforge.net/ 在我们的示例中,我们将使用MySQL DB作为示例。 因此,第一步是确保从Rexx SQL站点下载所需的驱动程序,以便Rexx程序可以相应地使用SQL。 因此,请
IntelliJ提供了数据库工具,允许您从IDE本身执行与数据库相关的操作。 它支持所有主要数据库,如MySQL,Oracle,Postgress,SQL服务器等等。 在本章中,我们将讨论IntelliJ如何支持MySQL数据库。 我们假设读者熟悉数据库概念,并在系统上安装和配置所需的数据库工具。 创建数据库 (Create Database) 首先,我们将创建一个数据库- test_db 。 在