Android的sqlite使用外部,Android 使用外部已经建立好的sqlite数据库
最近项目需要通过电话号码查询归属地,决定直接在本地sqlite的数据库进行查询,没必要去访问网络(虽然最后还是决定还是将数据库放在服务器上
)
一 首先先将外部的sqlite数据库放入assets文件夹下面
注意:
必须是sqlite数据库(XXX.db),如果是access(XXX.mdb)的必须进行转换,网上有一些数据库转换器,或者使用SQLite Expert
二 创建AssetsDatabaseManager用来获得操作数据库的SQLiteDatabase
package com.ld.qmwj.dao.phonenumserach;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.AssetManager;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
/**
* This is a Assets Database Manager
* Use it, you can use a assets database file in you application
* It will copy the database file to "/data/data/[your application package name]/database" when you first time you use it
* Then you can get a SQLiteDatabase object by the assets database file
* @author RobinTang
* @time 2012-09-20
*
*
* How to use:
* 1. Initialize AssetsDatabaseManager
* 2. Get AssetsDatabaseManager
* 3. Get a SQLiteDatabase object through database file
* 4. Use this database object
*
* Using example:
* AssetsDatabaseManager.initManager(getApplication()); // this method is only need call one time
* AssetsDatabaseManager mg = AssetsDatabaseManager.getManager(); // get a AssetsDatabaseManager object
* SQLiteDatabase db1 = mg.getDatabase("db1.db"); // get SQLiteDatabase object, db1.db is a file in assets folder
* db1.??? // every operate by you want
* Of cause, you can use AssetsDatabaseManager.getManager().getDatabase("xx") to get a database when you need use a database
*/
public class AssetsDatabaseManager {
private static String tag = "QMWJ"; // for LogCat
private static String databasepath = "/data/data/%s/database"; // %s is packageName
// A mapping from assets database file to SQLiteDatabase object
private Map databases = new HashMap();
// Context of application
private Context context = null;
// Singleton Pattern
private static AssetsDatabaseManager mInstance = null;
/**
* Initialize AssetsDatabaseManager
* @param context, context of application
*/
public static void initManager(Context context){
if(mInstance == null){
mInstance = new AssetsDatabaseManager(context);
}
}
/**
* Get a AssetsDatabaseManager object
* @return, if success return a AssetsDatabaseManager object, else return null
*/
public static AssetsDatabaseManager getManager(){
return mInstance;
}
private AssetsDatabaseManager(Context context){
this.context = context;
}
/**
* Get a assets database, if this database is opened this method is only return a copy of the opened database
* @param dbfile, the assets file which will be opened for a database
* @return, if success it return a SQLiteDatabase object else return null
*/
public SQLiteDatabase getDatabase(String dbfile) {
if(databases.get(dbfile) != null){
Log.i(tag, String.format("Return a database copy of %s", dbfile));
return (SQLiteDatabase) databases.get(dbfile);
}
if(context==null)
return null;
Log.i(tag, String.format("Create database %s", dbfile));
String spath = getDatabaseFilepath();
String sfile = getDatabaseFile(dbfile);
File file = new File(sfile);
SharedPreferences dbs = context.getSharedPreferences(AssetsDatabaseManager.class.toString(), 0);
boolean flag = dbs.getBoolean(dbfile, false); // Get Database file flag, if true means this database file was copied and valid
if(!flag || !file.exists()){
file = new File(spath);
if(!file.exists() && !file.mkdirs()){
Log.i(tag, "Create \""+spath+"\" fail!");
return null;
}
if(!copyAssetsToFilesystem(dbfile, sfile)){
Log.i(tag, String.format("Copy %s to %s fail!", dbfile, sfile));
return null;
}
dbs.edit().putBoolean(dbfile, true).commit();
}
SQLiteDatabase db = SQLiteDatabase.openDatabase(sfile, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
if(db != null){
databases.put(dbfile, db);
}
return db;
}
private String getDatabaseFilepath(){
return String.format(databasepath, context.getApplicationInfo().packageName);
}
private String getDatabaseFile(String dbfile){
return getDatabaseFilepath()+"/"+dbfile;
}
private boolean copyAssetsToFilesystem(String assetsSrc, String des){
Log.i(tag, "Copy "+assetsSrc+" to "+des);
InputStream istream = null;
OutputStream ostream = null;
try{
AssetManager am = context.getAssets();
istream = am.open(assetsSrc);
ostream = new FileOutputStream(des);
byte[] buffer = new byte[1024];
int length;
while ((length = istream.read(buffer))>0){
ostream.write(buffer, 0, length);
}
istream.close();
ostream.close();
}
catch(Exception e){
e.printStackTrace();
try{
if(istream!=null)
istream.close();
if(ostream!=null)
ostream.close();
}
catch(Exception ee){
ee.printStackTrace();
}
return false;
}
return true;
}
/**
* Close assets database
* @param dbfile, the assets file which will be closed soon
* @return, the status of this operating
*/
public boolean closeDatabase(String dbfile){
if(databases.get(dbfile) != null){
SQLiteDatabase db = (SQLiteDatabase) databases.get(dbfile);
db.close();
databases.remove(dbfile);
return true;
}
return false;
}
/**
* Close all assets database
*/
static public void closeAllDatabase(){
Log.i(tag, "closeAllDatabase");
if(mInstance != null){
for(int i=0; i
if(mInstance.databases.get(i)!=null){
mInstance.databases.get(i).close();
}
}
mInstance.databases.clear();
}
}
}
在getDatabase中,第一次先将assets中的数据库拷贝到当前工程下(/data/data/[your application package name]/database/数据库名称)
以后就可以直接在database中获得该数据库的SQLiteDatabase,从而进行增删改查操作了
三 使用
// 初始化,只需要调用一次
AssetsDatabaseManager.initManager(getApplication());
// 获取管理对象,因为数据库需要通过管理对象才能够获取
AssetsDatabaseManager mg = AssetsDatabaseManager.getManager();
// 通过管理对象获取数据库
SQLiteDatabase db1 = mg.getDatabase("data.db");
// 对数据库进行操作
db1.execSQL("XXXXXX");
Android的sqlite使用外部,Android 使用外部已经建立好的sqlite数据库相关推荐
- chromebook刷机_如何获取Android应用以查看Chromebook上的外部存储
chromebook刷机 Android apps are a great way to expand the sometimes limited capabilities of Chromebook ...
- android 自定义透明 等待 dialog,Android自定义Dialog内部透明、外部遮罩效果
Android自定义Dialog内部透明.外部遮罩效果 发布时间:2020-09-09 03:01:41 来源:脚本之家 阅读:117 作者:zst1303939801 本文实例为大家分享了Andro ...
- android Studio keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件
//android Studio keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件 遇到这个问题好久了,一直没解决今天搜集了大量的资料,有的说什么Java没配置好,不是扯犊子吗 ...
- android u盘读写权限,Android 外部SD卡/U盘无法写入解决方法(需要root)
但今天我遇到一个问题,就是我买了只TF卡装上去以后发现:一般程序无法写入TF卡,而系统自带的文件工具能够写入. 什么原因呢? 好在这个平板已经是root的,马上调出rootexplorer文件管理器查 ...
- android Studio keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件
//android Studio keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件 遇到这个问题好久了,一直没解决今天搜集了大量的资料,有的说什么Java没配置好,不是扯犊子吗 ...
- Android复习01(内部存储、外部存储、SD卡存储、XML解析、Json解析、保存登录密码)
2020年 3月19日 星期四 [第5周]Android录播回放 笔记 https://gitee.com/wang_zhiguo/Course0501 老师把上课用的案例源码,放在了Gitee仓库中 ...
- Android studio adb 不是内部或外部指令,也不是可运行的程序
因为我是默认安装的 所以路径是在C:\Users\Administrator\AppData\Local\Android\Sdk 把上面两个文件夹的路径配置到环境变量中去,然后还不行的话执行下面上个步 ...
- Android移动开发之【Android实战项目】DAY8-Android studio查看SQLIte数据库文件
最近在做SQLIte,建表以后,却无法找到数据库文件用模拟器测试,在Eclipse中打开DDMS -->File Explorer-->data-->data-->对应包下-- ...
- android如何实现用户注册功能,Android 实现简单的登录注册功能(SharedPreferences和SQLite)...
最近恰好作了一个Android的登陆注册界面,将数据利用SharedPreferences或者SQLite绑定到Android程序中,实现简单的登录注册功能,本文未涉及到与服务器的交流.java 首先 ...
最新文章
- 【无标题】ubuntu20.04 开机引导后黑屏 光标闪现 无法进入图形桌面的解决方案_Denis.Zzzzzzzz?的博客-CSDN博客_ubuntu20黑屏光标闪烁
- ESP32-CAM教程一:网页上显示摄像头数据
- python微型web框架flask介绍
- vue cli3.3 以上版本配置vue.config.js 及反向代理操作解决跨域操作
- 用g++编译生成动态连接库*.so的方法及连接
- php - 微信 - 缓存access_token类。
- 岁月的脚步,被时间冲刷——如何修复EM ?
- 【OpenCV入门指南】第四篇 图像的二值化
- java 实体类重写排序,对自定义对象进行排序(C++/Java) | 学步园
- C#,SharpGL开发的3D图表控件
- Android学习资料网站搜集
- 玻尔原子模型中各轨道半径、轨道能量公式推导
- 验证座机号码是否输入格式正确
- 碰到高速下载器捆绑软件自动下载,卸载不完怎么办?
- 数字信号处理之均值、方差、均方值、均方差计算和它们的物理意义
- hcl出现“Invalid ciphertext password.”错误的解决方法
- unity3d热更新插件uLua
- iphonex 序列号_iPhoneX怎么看序列号?苹果iPhoneX查看序列号的三种方法
- BestCoder Round #85 (hdu5804,hdu5805,hdu5806,hdu5807)
- [激光原理与应用-16]:《激光原理与技术》-2- 光的本质(粒子、波动说、电磁波、量子)
热门文章
- Spring boot(十二):Spring boot 如何测试、打包、部署
- java jep_Java 10 – JEP 286:局部变量类型推断
- spring health_为什么Spring的Health会再次向下,向下,向上,向上,向上和向下?...
- java ee各类组件_在Java EE组件中使用骆驼路线
- gradle maven_将工件从Gradle自动提升到Maven Central
- javaserver_如何在JavaServer Pages中使用Salesforce REST API
- 花痴流口水颜文字_流口水可执行模型
- apache jmx_用于JMX访问的Apache Ant任务
- netbeans6.8_NetBeans IDE 8.0和Java 8的新功能
- java教程java自学_15必须阅读Java 8教程