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
(不知道怎么上传代码了,是不是我的权限不够啊,下载地址:点击打开链接)
Ormlite自定义db的位置和自动更新问题的更多相关文章
- Android学习系列(3)--App自动更新之自定义进度视图和内部存储
友好的视觉感知和稳定的不出错表现,来自于我们追求美感和考虑的全面性,博客园从技术的角度,一直我都很欣赏.这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 这 ...
- .Net桌面程序自动更新NAppUpdate
自动更新介绍 我们做了程序,不免会有版本升级,这就需要程序有自动版本升级的功能.应用程序自动更新是由客户端应用程序自身负责从一个已知服务器下载并安装更新,用户唯一需要进行干预的是决定是否愿意现在或以后 ...
- fedora23没有/var/log/messages &如何禁用后台自动更新软件?
警告!! Linux是一个非常敏感的操作系统,若删除文件错误,很容易造成系统崩溃. fedora23没有/var/log/messages 不是没有messages这个文件,而是 从 fc core ...
- EF Core中怎么实现自动更新实体的属性值到数据库
我们在开发系统的时候,经常会遇到这种需求数据库表中的行被更新时需要自动更新某些列. 数据库 比如下面的Person表有一列UpdateTime,这列数据要求在行被更新后自动更新为系统的当前时间. Pe ...
- 使用Azure Functions 在web 应用中启用自动更新(一)分析基于轮询的 Web 应用的限制
1,引言 上一篇介绍了使用使用 Visual Studio 开发 "Azure Functions" 函数,此篇介绍 “Azure Functions” 的测试以及直接从 Vist ...
- 【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!
在 冰河技术 微信公众号前面的文章中,我们介绍了如何使用注解来自动装配Spring组件.之前将的都是在来的字段上添加注解,那有没有什么方法可以实现方法.构造器位置的自动装配吗?今天我们就一起来探讨下如 ...
- QML 从无到有 3 (自动更新)
新的需求出来啦,需要自动更新功能,不怕程序升级了. 自动更新,QML不好写,需要c++来辅助,这里就涉及QML中调用c++功能(这里就不写了,百度一下,很多). 思路:获取版本>下载程序> ...
- 艺萌TCP文件传输及自动更新系统介绍(TCP文件传输)(四)
艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开源,作者是英国的,开发时间5年多,框架很稳定. 项 ...
- 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)
艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...
随机推荐
- skin++ 终极破解之法
*[标题]:Skin++通用界面换肤系统V2.0.1破解探讨 *[作者]:gz1X <gz1x(at)tom(dot)com> *[来自]:中国黑客联盟 *[前言]: skin技术,大家都 ...
- 绫致时装讲述O2O细节:野心在“私人定制” - 移动购物 - 亿邦动力网
绫致时装讲述O2O细节:野心在"私人定制" - 移动购物 - 亿邦动力网 绫致时装讲述O2O细节:野心在"私人定制" 作者: 亿邦动力网来源: 亿邦动力网201 ...
- Average(模拟)
Average Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
- 免费利用网页版谷歌翻译实现任意语言转换php版
本文源发布地址: http://ourgarden.cn/2013/07/20/%E5%85%8D%E8%B4%B9%E5%88%A9%E7%94%A8%E7%BD%91%E9%A1%B5%E7%89 ...
- Android中activity保存数据和状态在哪个方法实现
以前只知道在Activity销毁之前,要把数据保存在 onSaveInstanceState(Bundle)方法中,后来学习了别人的微博,学到了很多细节问题,所以整理了一下,希望能帮到大家. 如果看官 ...
- 动态规划---最长上升子序列问题(O(nlogn),O(n^2))
LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列.很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) . ******* ...
- java 如何自定义异常 用代码展示 真心靠谱
先建两个自定义的异常类 ChushufuException类 class ChushufuException extends Exception { public ChushufuException( ...
- Checkbox in DataList
一,效果图. 二,源代码. <!DOCTYPE html><html><head> <meta charset="UTF-8"> & ...
- Activity跳转
本例中MainActivity为:FirstActivity.java FirstActivity如下: package com.wyl.intentmultiactivitytest; import ...
- Appium 服务命令行参数
Appium 可以直接通过命令行启动,同样支持命令行参数配置 参考: http://appium.io/slate/cn/master/ 使用方法 例如: appium --shell 服务器标志 ...