在我的
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提前