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年多,框架很稳定. 项 ...
随机推荐
- HTML5 总结-应用程序缓存-8
HTML 5 应用程序缓存 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. 什么是应用程序缓存(Application Cache)? HTM ...
- python成长之路17
一:web框架的本质,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1.1:python实现: #!/usr/bin/env python ...
- c语言中双维数组与指针的那点事儿
说起c语言的指针,估计对c语言只是一知半解的同志们可能都会很头疼,尤其它跟数组又无耻的联系到一起的时候,就更加淫荡了!!! 怎么说呢,就是有一点规定:(或准则) 数组名可以看成是指向数组头元素的指针, ...
- HTTPS的学习总结
HTTPS学习总结 简述 HTTPS对比HTTP就多了一个安全层SSL/TLS,具体就是验证服务端的证书和对内容进行加密. 先来看看HTTP和HTTPS的区别 我用AFN访问http下的httpbin ...
- ThinkPHP 3.1.2 模板的使用技巧
本节课大纲: 一.模板包含 <include file="完整模板文件名" /> <include file="./Tpl/default/Public ...
- perl 处理json 数组格式
[root@dr-mysql01 ~]# cat a1.pl use Encode; use JSON; use URI::Escape; use LWP::Simple; my $host = &q ...
- vc 获取网页内容(HTTP)
BOOL bResult = FALSE; // 初始化WinInet 环境 HINTERNET hInternet = InternetOpen("CEHTTP", ...
- 高级爬虫工程师(Spider)-美团网-拉勾网-最专业的互联网招聘平台
高级爬虫工程师(Spider)-美团网-拉勾网-最专业的互联网招聘平台 高级爬虫工程师(Spider)
- Activity 的生命周期
两个大窗口的Activity之间的切换: 启动一个新的Activity时,需要依次调用oncreate.onstart.onResume方法,OnCreate方法是在第一次创建Activity的时候调 ...
- 简单的iOS抽屉效果
#define screenW [UIScreen mainScreen].bounds.size.width #import "ViewController.h" @interf ...