简体   繁体   English

无法在Android的Google Nexus One设备中创建SQLite DB?

[英]Failed to create SQLite DB in my Google Nexus One device in Android?

I am working on an application in which I am creating my local sqlite database, and its working successfully in all the devices except the Google Nexus One with OS 2.3.3 . 我正在使用一个应用程序在其中创建我的本地sqlite数据库,并且该应用程序可以在除带有OS 2.3.3Google Nexus One之外的所有设备中成功运行 Logs: 日志:

 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)

Please suggest me, how can I solve this problem..!!:( 请建议我,我该如何解决这个问题.. !! :(

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

If this particular database file works everywhere except in old Android versions, then it is likely that you are using some SQLite feature that is not available in older SQLite version. 如果该特定数据库文件在旧版Android之外的任何地方都可以使用,则可能是您使用的某些SQLite功能在旧版SQLite中不可用。

For example, WAL is supported beginning with SQLite 3.7, but Froyo has SQLite 3.6.22. 例如,从SQLite 3.7开始支持WAL,但是Froyo具有SQLite 3.6.22。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM