• Ormlite自定义db的位置和自动更新问题


    先说说以下为测试代码,有点乱,大家讲究着看。以下例子都是采用的ormlite的框架。

    第一步,自定义数据库的位置:

    建议一个类DatabaseHelper 继承 OrmLiteSqliteOpenHelper,然后重写getWritableDatabase,getReadableDatabase方法

    @Override
    	public synchronized SQLiteDatabase getWritableDatabase() {
    		LogUtil.e(DatabaseHelper.class.getName(), "getWritableDatabase()");
    		/*super.getWritableDatabase();*/
    		return SQLiteDatabase.openDatabase(DATABASE_PATH, null,
    				SQLiteDatabase.OPEN_READWRITE);
    	}
    
    	@Override
    	public synchronized SQLiteDatabase getReadableDatabase() {
    		LogUtil.e(DatabaseHelper.class.getName(), "getReadableDatabase()");
    		/*super.getReadableDatabase();*/
    		return SQLiteDatabase.openDatabase(DATABASE_PATH, null,
    				SQLiteDatabase.OPEN_READONLY);
    	}


    注意我这里是屏蔽了super的方法的。

    第二步在app中编写:

    File f = new File(DatabaseHelper.DATABASE_PATH);
    		if (!f.exists()) {
    			LogUtil.e(TAG, "!f.exists()");
    			if (Environment.getExternalStorageState().equals(
    					Environment.MEDIA_MOUNTED) == true) {
    				LogUtil.e(TAG, "Environment.MEDIA_MOUNTED == true");
    				File f1 = new File(Environment.getExternalStorageDirectory()
    						+ "/timetask/database");
    				f1.mkdirs();
    				SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(
    						DatabaseHelper.DATABASE_PATH, null);
    				DatabaseHelper orm;
    				try {
    					orm = new DatabaseHelper(this);
    					orm.onCreate(db);
    					db.close();
    				} catch (NameNotFoundException e) {
    					e.printStackTrace();
    				}
    
    			}
    		}

    用来初次创建自定义的库。

    这样就已经可以成功创建了自定义的库,但是问题来了,没有在getWritableDatabase中调用super.getWritableDatabase()方法,和getReadableDatabase中调用super.getReadableDatabase(),会发现根本就没有走DatabaseHelper中的onCreate和onUpgrade方法,这样就照成了一个问题,无法自动更新数据库。然后我打开了super,出现了这样的错误:

    12-12 16:54:58.240: E/SQLiteLog(15354): (1) table `simpledata` already exists
    12-12 16:54:58.260: E/com.example.ormlitebdtest.DatabaseHelper(15354): Can't create database
    12-12 16:54:58.260: E/com.example.ormlitebdtest.DatabaseHelper(15354): java.sql.SQLException: SQL statement failed: CREATE TABLE `simpledata` (`date` VARCHAR , `string` VARCHAR , `millis` BIGINT , `id` INTEGER PRIMARY KEY AUTOINCREMENT , `even` SMALLINT ) 
    12-12 16:54:58.260: E/com.example.ormlitebdtest.DatabaseHelper(15354):         at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)
    12-12 16:54:58.260: E/com.example.ormlitebdtest.DatabaseHelper(15354):         at com.j256.ormlite.table.TableUtils.doStatements(TableUtils.java:464)
    12-12 16:54:58.260: E/com.example.ormlitebdtest.DatabaseHelper(15354):         at com.j256.ormlite.table.TableUtils.doCreateTable(TableUtils.java:440)
    12-12 16:54:58.260: E/com.example.ormlitebdtest.DatabaseHelper(15354):         at com.j256.ormlite.table.TableUtils.createTable(TableUtils.java:220)
    12-12 16:54:58.260: E/com.example.ormlitebdtest.DatabaseHelper(15354):         at com.j256.ormlite.table.TableUtils.createTable(TableUtils.java:53)
    12-12 16:54:58.260: E/com.example.ormlitebdtest.DatabaseHelper(15354):         at com.example.ormlitebdtest.DatabaseHelper.onCreate(DatabaseHelper.java:30)
    12-12 16:54:58.260: E/com.example.ormlitebdtest.DatabaseHelper(15354):         at com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper.onCreate(OrmLiteSqliteOpenHelper.java:207)
    12-12 16:54:58.260: E/com.example.ormlitebdtest.DatabaseHelper(15354):         at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)

    已经创建了的表,再次调用会报错。

    我只有关闭了super的方法,进行手动调用onUpgrade,于是在app的类中写了

    else{
    			LogUtil.e(TAG, "f.exists()");
    			if (Environment.getExternalStorageState().equals(
    					Environment.MEDIA_MOUNTED) == true) {
    				LogUtil.e(TAG, "Environment.MEDIA_MOUNTED == true");
    				SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(
    						DatabaseHelper.DATABASE_PATH, null);
    				DatabaseHelper orm;
    				try {
    					orm = new DatabaseHelper(this);
    					orm.onUpgrade(db, db.getVersion(), getPackageManager().getPackageInfo(getPackageName(), 0).versionCode);
    					db.close();
    				} catch (NameNotFoundException e) {
    					e.printStackTrace();
    				}
    
    			}


    进行手动调用,打印的log如下

    这样就调用了更新方法。

    不知道这个方式是不是挺bug的,希望大家提提意见和建议,谢谢了。

    关于db location的问题参考了:http://stackoverflow.com/questions/6629021/android-ormlite-db-location/13111761#13111761
    (不知道怎么上传代码了,是不是我的权限不够啊,下载地址:点击打开链接

  • 相关阅读:
    修改数据库的兼容级别
    如何写出安全的API接口
    最新IP地址数据库
    java 中的静态(static)代码块
    Java RTTI(类型信息)(.class 类对象)
    机器学习之决策树预测——泰坦尼克号乘客数据实例
    敏捷开发 —— TDD(测试驱动开发)
    Java 内存泄漏
    红顶商人 —— 胡雪岩
    各地特色美食与点菜的艺术
  • 原文地址:https://www.cnblogs.com/riasky/p/3473504.html
Copyright © 2020-2023  润新知