先说说以下为测试代码,有点乱,大家讲究着看。以下例子都是采用的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的位置和自动更新问题的更多相关文章

  1. Android学习系列(3)--App自动更新之自定义进度视图和内部存储

    友好的视觉感知和稳定的不出错表现,来自于我们追求美感和考虑的全面性,博客园从技术的角度,一直我都很欣赏.这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 这 ...

  2. .Net桌面程序自动更新NAppUpdate

    自动更新介绍 我们做了程序,不免会有版本升级,这就需要程序有自动版本升级的功能.应用程序自动更新是由客户端应用程序自身负责从一个已知服务器下载并安装更新,用户唯一需要进行干预的是决定是否愿意现在或以后 ...

  3. fedora23没有/var/log/messages &如何禁用后台自动更新软件?

    警告!! Linux是一个非常敏感的操作系统,若删除文件错误,很容易造成系统崩溃. fedora23没有/var/log/messages 不是没有messages这个文件,而是 从 fc core ...

  4. EF Core中怎么实现自动更新实体的属性值到数据库

    我们在开发系统的时候,经常会遇到这种需求数据库表中的行被更新时需要自动更新某些列. 数据库 比如下面的Person表有一列UpdateTime,这列数据要求在行被更新后自动更新为系统的当前时间. Pe ...

  5. 使用Azure Functions 在web 应用中启用自动更新(一)分析基于轮询的 Web 应用的限制

    1,引言 上一篇介绍了使用使用 Visual Studio 开发 "Azure Functions" 函数,此篇介绍 “Azure Functions” 的测试以及直接从 Vist ...

  6. 【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!

    在 冰河技术 微信公众号前面的文章中,我们介绍了如何使用注解来自动装配Spring组件.之前将的都是在来的字段上添加注解,那有没有什么方法可以实现方法.构造器位置的自动装配吗?今天我们就一起来探讨下如 ...

  7. QML 从无到有 3 (自动更新)

    新的需求出来啦,需要自动更新功能,不怕程序升级了. 自动更新,QML不好写,需要c++来辅助,这里就涉及QML中调用c++功能(这里就不写了,百度一下,很多). 思路:获取版本>下载程序> ...

  8. 艺萌TCP文件传输及自动更新系统介绍(TCP文件传输)(四)

    艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开源,作者是英国的,开发时间5年多,框架很稳定. 项 ...

  9. 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)

    艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...

随机推荐

  1. QT自定义对象导入JavaScript脚本使用

    1.对象 项目属性要添加 QT += script自定义的对象头文件如下,实现正常就好,记得脚本里要调用的方法一定要定义在public slots:下,要不然调用时提示该对象没有*方法   #ifnd ...

  2. 一些安全相关的HTTP响应头

    转:http://www.2cto.com/Article/201307/230740.html 现代浏览器提供了一些安全相关的响应头,使用这些响应头一般只需要修改服务器配置即可,不需要修改程序代码, ...

  3. hibernate Criteria查询 2.3

    Criteria对象提供了一种面向对象的方式查询数据库.Criteria对象需要使用Session对象来获得一个Criteria对象表示对一个持久化类的查询 查询所有 Session session ...

  4. C# RSA在服务上使用出现拒绝方法错误的解决方法

    在做一个快钱接口的时候,遇到了.net RSA加密无法在一台win2008服务器上运行正常,更换到Win2003服务器后出现问题,具体表现如下: “/”应用程序中的服务器错误. ----------- ...

  5. DescribingDesign Patterns 描述设计模式

    DescribingDesign Patterns 描述设计模式 How do we describe design patterns?Graphical notations, while impor ...

  6. 程序中使用事务来管理sql语句的执行,执行失败时,可以达到回滚的要求。

    1.设置使用事务的SQL执行语句 /// <summary> /// 使用有事务的SQL语句 /// </summary> /// <param name="s ...

  7. Tomcat 内存设置

    大型项目或者使用了SSH 的话, Tomcat 可能会报 java.lang.OutOfmemoryError: PermGen Space Windows: 在 bin/catlina.bat 最上 ...

  8. CentOS 添加常用 yum 源

    CentOS 的官方源去掉了一些与版权有关的软件,因此想要安装这些软件或者手动下载安装,或者使用其他源. 下面我推荐常用的两个源, 这两个源基本可以满足一般服务器的使用需求. 首先, 添加源之前要确定 ...

  9. WM_PAINT消息小结

    WM_PAINT是Windows窗口系统中一条重要的消息,应用程序通过处理该消息实现在窗口上的绘制工作. 1. 系统何时发送WM_PAINT消息? 系统会在多个不同的时机发送WM_PAINT消息:当第 ...

  10. 凡客副总裁被曝离职:或因IPO受阻|凡客|王春焕|离职_互联网_新浪科技_新浪网

    凡客副总裁被曝离职:或因IPO受阻|凡客|王春焕|离职_互联网_新浪科技_新浪网 凡客副总裁被曝离职:或因IPO受阻 2013年05月07日 00:56   每日经济新闻    我有话说     每经 ...