登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

SQLlite数据库指定存储位置 [复制链接]

2017-8-10 12:17
PPP孩 阅读:436 评论:2 赞:2
Tag:  SQLlite
将我们的数据库放到外设存储,不仅仅放在机器存储中,可以应用到一些需要单独处理或做关键信息备份使用
思路就是使用SQLiteOpenHelper构造方法+自定义ContextWrapper
我们倒着推导一下思路:
1.数据库对象实例化时,需要我们创建SQLiteOpenHelper对象来实现数据库的创建、更新,及后续的数据库操作
2.SQLiteOpenHelper所提供的构造方法,拿到路径,通过该路径创建数据库
下面看实现:
1.继承SQLiteOpenHelper
构造方法:

[代码]java代码:

 public OurSqlLiteHelper(Context context) {
            super(new DataBaseContext(context, String path), database_name, null, version);
        }


DataBaseContext(context, String path)从哪来?

2.继承ContextWrapper构造Context,通过构造方法对路径进行赋值。

String ourPath;//被赋值的路径
 

[代码]java代码:

public DataBaseContext(Context base, String dirPath) {
        super(base);
        this.ourPath= dirPath;
    }


拿到路径,重写父类方法,创建数据库文件路径:

[代码]java代码:

  @Override
    public File getDatabasePath(String name) {
        File result = new File(ourPath+ File.separator + name);

        if (!result.getParentFile().exists()) {
            result.getParentFile().mkdirs();//路径不存在,创建
        }

        return result;
    }

重写两个重要方法,打开或创建数据库文件:

[代码]java代码:

public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory){
return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler){
return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name).getAbsolutePath(), factory, errorHandler);
}


至此,我们自定义数据库路径流程就完成了。

关于数据库的使用方面需要关注的点:
数据库的升级:初学者很容易在数据库升级的时候删除原有数据表,对于不重要的信息没毛病,但是对于一些关键的信息,这样对用户就不是很友好。假设我们只有新增没有删除,我们实际开发中所使用的方式那就应该是这样的:
alter table
sql语句:
 if(oldVersion <变化版本){
               String new_column  = "alter table "+ TABLE_NAME +" add " + 新字段 +" default 默认值 ";
                db.execSQL(new_column);
            }
而不是这样的:
drop table
对于增删改查,由于可能存在应用突然被关闭或杀掉,而我们又需要在出现不可预料问题时保证我们数据的干净,至少不是改了一半,此时我们需要用到事物Transaction,养成良好习惯:拿到数据库对象后,开启事物beginTransaction,执行完insert,update,delete后setTransactionSuccessful成功提交,以免回滚。最后关闭资源前endTransaction结束我们的事物


分享到:
我来说两句
facelist
您需要登录后才可以评论 登录 | 立即注册
所有评论(2)
test_user 2017-8-10 16:00
  
回复
forbeat1 2017-8-10 16:14
  
回复

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

广告投放| 申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

返回顶部