android 地址数据库,android 数据库更改数据库位置【DbFlow示范】

//初始化数据库

public static void initDB() {

boolean premission = PermissionUtils.isPremission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);

if (!premission) return;

File file = CreatFileUtil.getRootFile(getApplication());

FileDatabaseContext mSdDatabaseContext = new FileDatabaseContext(context, file, true);

FlowManager.init(mSdDatabaseContext);

}

//重新加载数据库

public static void deleteDB() {

File file = CreatFileUtil.getRootFile(getApplication());

file.delete();

FlowManager.destroy();// 释放引用,才能重新创建表

initDB();

}package com.jtv.operation.dao;

import android.content.Context;

import android.content.ContextWrapper;

import android.database.DatabaseErrorHandler;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

import android.text.TextUtils;

import com.raizlabs.android.dbflow.config.FlowLog;

import java.io.File;

import java.io.FileOutputStream;

import java.io.InputStream;

/**

* 支持数据库任意地址

*

* 支持使用打包的数据库res/raw/initdb.db

*

* @author 更生

* @version 2017年3月2日

*/

public class FileDatabaseContext extends ContextWrapper {

private File file;

private boolean isUseDefaultDB;

private Context context;

/**

* @param base 上下文

* @param file 文件存储目录

* @param isUseDefaultDB 是否使用raw/initdb.db文件

*/

public FileDatabaseContext(Context base, File file, boolean isUseDefaultDB) {

super(base);

this.file = file;

this.context = base;

this.isUseDefaultDB = isUseDefaultDB;

}

@Override

public Context getApplicationContext() {

return this;

}

@Override

public File getDatabasePath(String name) {

//携带数据库

if (isUseDefaultDB) {

File tempFile = file;

if (tempFile == null)

tempFile = context.getDatabasePath(name).getParentFile();

createInitDatabase(tempFile, name, context);

}

if (file == null)

return context.getDatabasePath(name);

// 判断目录是否存在,不存在则创建该目录

if (!file.exists())

file.mkdirs();

File addressFile = new File(file, name);

if (addressFile == null)

addressFile = context.getDatabasePath(name);

return addressFile;

}

public boolean createInitDatabase(File toFile, String name, Context context) {

String path = toFile.getAbsolutePath();

if (TextUtils.isEmpty(path))

return false;

// 判断数据文件是否存在,不存在的话使用打包的数据文件

String toFileName = path + File.separator + name;

File f = new File(toFileName);

if (f == null || f.exists())

return false;

File dir = new File(path);

if (dir == null) return false;

if (!dir.exists())

dir.mkdirs();

InputStream is = null;

FileOutputStream fos = null;

try {

is = context.getResources().openRawResource(context.getResources().getIdentifier("initdb", "raw", context.getPackageName()));

// 创建输出流

fos = new FileOutputStream(toFileName);

// 将数据输出

byte[] buffer = new byte[8192];

int count = 0;

while ((count = is.read(buffer)) > 0) {

fos.write(buffer, 0, count);

}

buffer = null;

} catch (Exception ee) {

FlowLog.log(FlowLog.Level.I, ee.toString());

} finally {

try {

fos.close();

} catch (Exception ee) {

}

try {

is.close();

} catch (Exception ee) {

}

}

return true;

}

//重载这个方法,是用来打开SD卡上的数据库的,android 2.3及以下会调用这个方法。

@Override

public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {

SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);

return result;

}

//Android 4.0会调用此方法获取数据库。

@Override

public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,

DatabaseErrorHandler errorHandler) {

SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);

return result;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值