先说说以下为测试代码,有点乱,大家讲究着看。以下例子都是采用的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. 【转载】国内网站博客数据统计选免费Google Analytics还是百度统计

    [转载]国内网站博客数据统计选免费Google Analytics还是百度统计 Google Analytics谷歌统计是我用的第一个网站统计工具,当然现在也一直在用.Google Analytics ...

  2. linux安装LNMP的资源

    wget http://nginx.org/download/nginx-0.7.69.tar.gz wget http://museum.php.net/php5/php-5.2.10.tar.gz ...

  3. 利用Linux系统函数alarm() 来检测计算机性能

    大家都知道,alarm() 是Linux系统自带的定时函数,操作系统管理进程时为每个进程分配了一个定时器,下面利用1秒钟定时,看计算机能计数多少来判断计算机的性能: #include<stdio ...

  4. C语言之ASCII码

    ASCII码 ASCII码值在65~90之间,为大写字母.ASCII码值在97~122之间,为小写字母.ASCII码值在48~57之间,为数字.ASCII码值不在上述3个范围内,为特殊字符.

  5. Application和Session的例子

    %@ Page Language="C#" AutoEventWireup="true" CodeBehind="ApplicationTest.as ...

  6. python异常处理URLError,HTTPError,Wrapping,

    们在使用爬虫来抓取网页内容的时候,HTTP异常是必须要注意的一项,所以本文,我们来详细探寻一下HTTP异常处理的相关内容,通过一些具体的实例来分析一下,非常的简单,但是却很实用.   先来说一说HTT ...

  7. git 使用过程(一、准备工作)

    没有多余的废话,只是纯粹的捞干的记录下一自己使用Git的过程.(正在学习中,也是刚接触,记录过程可能有点乱.等熟悉之后在重新整理一下) 一.先下载git客户端 网址:http://msysgit.gi ...

  8. 静态化 - 伪静态技术(Apache Rewrite 实现)

    打开apache的配置文件httpd.conf 找到 #LoadModule rewrite_module modules/mod_rewrite.so 把前面#去掉.没有则添加,但必选独占一行,使a ...

  9. Qt中文件操作遇到的(变量,容器,结构体)

    咳咳!总结了一下我在使用QT文件操作时所用到的,再接再厉!再接再厉!! 1.保存到文件: QFile file("test.txt"); if (!file.open(QIODev ...

  10. ASP.NET MVC 5 学习教程:数据迁移之添加字段

    原文 ASP.NET MVC 5 学习教程:数据迁移之添加字段 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符 ...