最近项目需要通过电话号码查询归属地,决定直接在本地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数据库相关推荐

  1. chromebook刷机_如何获取Android应用以查看Chromebook上的外部存储

    chromebook刷机 Android apps are a great way to expand the sometimes limited capabilities of Chromebook ...

  2. android 自定义透明 等待 dialog,Android自定义Dialog内部透明、外部遮罩效果

    Android自定义Dialog内部透明.外部遮罩效果 发布时间:2020-09-09 03:01:41 来源:脚本之家 阅读:117 作者:zst1303939801 本文实例为大家分享了Andro ...

  3. android Studio keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件

    //android Studio  keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件 遇到这个问题好久了,一直没解决今天搜集了大量的资料,有的说什么Java没配置好,不是扯犊子吗 ...

  4. android u盘读写权限,Android 外部SD卡/U盘无法写入解决方法(需要root)

    但今天我遇到一个问题,就是我买了只TF卡装上去以后发现:一般程序无法写入TF卡,而系统自带的文件工具能够写入. 什么原因呢? 好在这个平板已经是root的,马上调出rootexplorer文件管理器查 ...

  5. android Studio keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件

    //android Studio  keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件 遇到这个问题好久了,一直没解决今天搜集了大量的资料,有的说什么Java没配置好,不是扯犊子吗 ...

  6. Android复习01(内部存储、外部存储、SD卡存储、XML解析、Json解析、保存登录密码)

    2020年 3月19日 星期四 [第5周]Android录播回放 笔记 https://gitee.com/wang_zhiguo/Course0501 老师把上课用的案例源码,放在了Gitee仓库中 ...

  7. Android studio adb 不是内部或外部指令,也不是可运行的程序

    因为我是默认安装的 所以路径是在C:\Users\Administrator\AppData\Local\Android\Sdk 把上面两个文件夹的路径配置到环境变量中去,然后还不行的话执行下面上个步 ...

  8. Android移动开发之【Android实战项目】DAY8-Android studio查看SQLIte数据库文件

    最近在做SQLIte,建表以后,却无法找到数据库文件用模拟器测试,在Eclipse中打开DDMS -->File Explorer-->data-->data-->对应包下-- ...

  9. android如何实现用户注册功能,Android 实现简单的登录注册功能(SharedPreferences和SQLite)...

    最近恰好作了一个Android的登陆注册界面,将数据利用SharedPreferences或者SQLite绑定到Android程序中,实现简单的登录注册功能,本文未涉及到与服务器的交流.java 首先 ...

最新文章

  1. 【无标题】ubuntu20.04 开机引导后黑屏 光标闪现 无法进入图形桌面的解决方案_Denis.Zzzzzzzz?的博客-CSDN博客_ubuntu20黑屏光标闪烁
  2. ESP32-CAM教程一:网页上显示摄像头数据
  3. python微型web框架flask介绍
  4. vue cli3.3 以上版本配置vue.config.js 及反向代理操作解决跨域操作
  5. 用g++编译生成动态连接库*.so的方法及连接
  6. php - 微信 - 缓存access_token类。
  7. 岁月的脚步,被时间冲刷——如何修复EM ?
  8. 【OpenCV入门指南】第四篇 图像的二值化
  9. java 实体类重写排序,对自定义对象进行排序(C++/Java) | 学步园
  10. C#,SharpGL开发的3D图表控件
  11. Android学习资料网站搜集
  12. 玻尔原子模型中各轨道半径、轨道能量公式推导
  13. 验证座机号码是否输入格式正确
  14. 碰到高速下载器捆绑软件自动下载,卸载不完怎么办?
  15. 数字信号处理之均值、方差、均方值、均方差计算和它们的物理意义
  16. hcl出现“Invalid ciphertext password.”错误的解决方法
  17. unity3d热更新插件uLua
  18. iphonex 序列号_iPhoneX怎么看序列号?苹果iPhoneX查看序列号的三种方法
  19. BestCoder Round #85 (hdu5804,hdu5805,hdu5806,hdu5807)
  20. [激光原理与应用-16]:《激光原理与技术》-2- 光的本质(粒子、波动说、电磁波、量子)

热门文章

  1. Spring boot(十二):Spring boot 如何测试、打包、部署
  2. java jep_Java 10 – JEP 286:局部变量类型推断
  3. spring health_为什么Spring的Health会再次向下,向下,向上,向上,向上和向下?...
  4. java ee各类组件_在Java EE组件中使用骆驼路线
  5. gradle maven_将工件从Gradle自动提升到Maven Central
  6. javaserver_如何在JavaServer Pages中使用Salesforce REST API
  7. 花痴流口水颜文字_流口水可执行模型
  8. apache jmx_用于JMX访问的Apache Ant任务
  9. netbeans6.8_NetBeans IDE 8.0和Java 8的新功能
  10. java教程java自学_15必须阅读Java 8教程