2012-10-10 84 views
0

我正在创建一个应用程序,在该应用程序中创建我的本地sqlite数据库,并且它的所有设备都成功工作,除了谷歌Nexus One OS 2.3.3。 日志:无法在Android的Google Nexus One设备中创建SQLite数据库?

CREATE TABLE android_metadata failed 
Failed to setLocale() when constructing, closing the database 
android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed 
    at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method) 
    at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1987) 
    at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1855) 
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820) 
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854) 
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847) 
    at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:567) 
    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118) 
    at com.weg.ecatalogue.database.ECatalogueDatabase.open(ECatalogueDatabase.java:76) 
    at com.weg.ecatalogue.HomeScreen.onCreate(HomeScreen.java:219) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:3839) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
    at dalvik.system.NativeStart.main(Native Method) 
    Deleting and re-creating corrupt database /data/data/com.weg.ecatalogue/databases/ECatalogue 
    android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed 
    at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method) 
    at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1987) 
    at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1855) 
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820) 
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854) 
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847) 
    at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:567) 
    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118) 
    at com.weg.ecatalogue.database.ECatalogueDatabase.open(ECatalogueDatabase.java:76) 
    at com.weg.ecatalogue.HomeScreen.onCreate(HomeScreen.java:219) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:3839) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
    at dalvik.system.NativeStart.main(Native Method) 

请给我建议,我怎么能解决这个问题.. !! :(

public class ECatalogueDatabase { 

    private static final String DB_PATH = "/data/data/com.weg.ecatalogue/databases/"; 
    public static final String DATABASE_NAME = "ECatalogue"; 
    public static final String DATABASE_TABLE = "T_Electrical"; 
    public static final int DATABASE_VERSION = 1; 

    public static final String KEY_ROWID="id"; 
    public static final String KEY_PRODUCT_LINE="productline"; 

    public static final String KEY_VOLTAGE="voltage"; 
    public static final String KEY_OUTPUTHP="outputhp"; 

    public static final String KEY_FRAME="frame"; 
    public static final String KEY_RPM="rpm"; 

    private Context context=null; 
    private DatabaseHelper DBHelper; 
    private SQLiteDatabase db; 

    /** 
    * Database creation sql statement 
    */ 
    private static final String CREAT_DATABASE="Create Table if not exists "+ DATABASE_TABLE+"("+ KEY_ROWID +" INTEGER PRIMARY KEY NOT NULL," 
    +KEY_PRODUCT_LINE +" nvarchar ,"+ KEY_OUTPUTHP+" numeric ,"+ KEY_RPM +" nvarchar ,"+KEY_VOLTAGE +" nvarchar ," +KEY_FRAME +" nvarchar"+")"; 

    /** 
    * Constructor - takes the context to allow the database to be 
    * opened/created 
    * 
    * @param ctx the Context within which to work 
    */ 
    public ECatalogueDatabase(Context ctx) { 
     this.context = ctx; 
     DBHelper = new DatabaseHelper(context); 
    } 
    //Helper class 
    private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
     public DatabaseHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL(CREAT_DATABASE); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      db.execSQL("DROP TABLE IF EXISTS titles"); 
      onCreate(db); 
     } 

    } 

    public ECatalogueDatabase open() //throws SQLException 
    { 
     try 
     { 
      db=DBHelper.getWritableDatabase(); 

     }catch(Exception exception) 
     { 
      exception.printStackTrace(); 
     } 
     return null; 
    } 


    public void close() 
    { 
     DBHelper.close(); 
    } 



    /** 
    * Creates a empty database on the system and rewrites it with your own database. 
    * */ 
    public void createDataBase() throws IOException{ 

     @SuppressWarnings("unused") 
     boolean dbExist = checkDataBase(); 

     /** 
     * CHANGES DONE BY SHAILESH SHARMA TO SOLVE THE PROBLEM OF 2.2 HTC DESIRE IN CLIENT'S WIFE DEVICE :(
     */ 
     SQLiteDatabase db_Read = null; 
     if(dbExist){ 
     //DO NOTHING IN THIS CASE 
     }else{ 

     db_Read = DBHelper.getReadableDatabase(); 
     db_Read.close(); 
     } 
     //================================= 

     try { 

      copyDataBase(); 

     } catch (IOException e) { 

      throw new Error("Error copying database"); 

     } 

    } 
    /** 
    * Check if the database already exist to avoid re-copying the file each time you open the application. 
    * @return true if it exists, false if it doesn't 
    */ 
    private boolean checkDataBase(){ 
     try{ 
      String myPath = DB_PATH + DATABASE_NAME; 
      db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

     }catch(SQLiteException e){ 
      System.out.println(e+"sos sos sos sos"); 
     } 

     if(db != null){ 

      db.close(); 

     } 

     return db != null ? true : false; 
    } 
    /** 
    * Copies your database from your local assets-folder to the just created empty database in the 
    * system folder, from where it can be accessed and handled. 
    * This is done by transfering bytestream. 
    * */ 
    private void copyDataBase() throws IOException{ 


     InputStream myInput = context.getAssets().open(DATABASE_NAME); 

     // Path to the just created empty db 
     String outFileName = DB_PATH + DATABASE_NAME; 


     OutputStream myOutput = new FileOutputStream(outFileName); 


     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = myInput.read(buffer))>0){ 
      myOutput.write(buffer, 0, length); 
     } 
     myOutput.flush(); 
     myOutput.close(); 
     myInput.close(); 

    } 

    public int getDatabaseCount(){ 
     int count = 0; 
     Cursor cursor = db.rawQuery("Select * from " + DATABASE_TABLE, null); 
     if(cursor!=null){ 
      count = cursor.getCount(); 
     } 
     cursor.deactivate(); 
     cursor.close(); 
     return count; 
    } 

回答

0

如果这个特殊的数据库文件作品无处不在,除了旧的Android版本,那么它很可能您正在使用SQLite的一些特点,就是不能在较早的SQLite的版本。

,例如Wal支持使用SQLite 3.7开始,但是升级Froyo具有的SQLite 3.6.22。

+0

我的mozilla firefox SQLite版本是0.7.7,是否会产生任何问题? –

+0

执行'SELECT sqlite_version();'获取数据库引擎的版本。另外,请在出货前显示您在数据库中执行的所有'PRAGMA'命令。 。 –

+0

CL你好,我Sqlit版本3.7.12.1,但我没有使用任何PRAGMA命令,你可以在我的代码中看到:( –

相关问题