Android的sqlite使用外部,Android 使用外部已经建立好的sqlite数据库

最近项目需要通过电话号码查询归属地,决定直接在本地sqlite的数据库进行查询,没必要去访问网络(虽然最后还是决定还是将数据库放在服务器上

icon_confused.gif )

一 首先先将外部的sqlite数据库放入assets文件夹下面

A222132173-212065.png

注意:

必须是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");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java流与文件——操作文件

【0】README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——操作文件 的相关知识; 0.2) for source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/ch…

阅读副本和Spring Data第2部分:配置基础项目

在上一篇文章中,我们使用相同的数据设置了多个PostgreSQL实例。 下一步将是使用这两个服务器来配置spring项目。 如前所述,由于我们使用完全相同的数据库,因此我们将使用Spring Boot JPA帖子中的一些代码。 这将是我们的gradle构建文件 pl…

java生成UUID通用唯一识别码

一、UUID概述UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。 UUID 的目…

android 项目部署,Android发布项目到JCenter

JCenter是什么大家应该都用过各种各样的Github上的第三方开源组件。类似这种效果的compile wang.yuchao.demoforjcenterlibrary:DemoForJCenterLibraryModel:1.2.5我们会比较好奇Android Studio 是从哪里得到这个类库的?Android Studio是从build.gradle里面定义的Ma…

java流与文件——对象流和序列化

【0】README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——对象流和序列化 的相关知识; 0.2) for source code , please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdva…

maven 版本号插件_测试Maven版本插件自动递增版本号

maven 版本号插件抽象 Maven版本插件是一个非常强大的工具,我在很大程度上依赖于它来协调软件版本。 通常,软件发行版本号遵循简单的1.0.0.0-SNAPSHOT格式。 但是最近我需要在版本号中添加一个限定符,例如1.0-beta-SNAPSHOT或1.0.0-fix-bug-d…

java中Date

在类 Date 所有可以接受或返回年、月、日期、小时、分钟和秒值的方法中,将使用下面的表示形式:年份 y 由整数 y - 1900 表示。月份由从 0 至 11 的整数表示;0 是一月、1 是二月等等;因此 11 是十二月。日期(一月中的某…

如何配置android的adb环境变量,如何配置adb环境变量?win7配置adb环境变量的方法...

本文教程小编分享就是win7系统配置adb环境变量的方法, windows7系统 电脑安装adb工具时,提示“adb不是内部或外部命令”这时候我们需要重新配置adb环境变量,那么win7系统怎么配置adb环境变量?网上介绍配置adb环境变量的方法比较少…

jep290涉及jdk版本_JDK 14 / JEP 305模式匹配“ Smart Casts”实例

jep290涉及jdk版本我通常将Java代码中instanceof运算符的存在视为“ 红色标志 ”,这意味着在某些情况下使用instanceof不一定是错误的,但是使用它有时表示可以通过更干净的方式解决设计问题,如所述本文结尾处引用的一些资源中的内容&#xff…

java中Date与DateFormat的格式输出

一、DateFormat java.text.DateFormat 使用 getDateInstance 来获取该国家/地区的标准日期格式。另外还提供了一些其他静态工厂方法。使用 getTimeInstance 可获取该国家/地区的时间格式。使用 getDateTimeInstance 可获取日期和时间格式。可以将不同选项传入这些工厂方法&…

二叉堆的操作总结(insert+deleteMin+increaseKey+decreaseKey+percolateDown+percolateUp)

【0】README 本文idea 均为原创, for source code, please visit https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter6/p140_binaryheap_conclusion 【1】insert操作 // Attention, the index of the heap starts from 1 void …

aws生态系统集成商_通过通用数据访问扩展AWS生态系统

aws生态系统集成商Amazon Web Services(AWS)可帮助组织托管和管理其数据流程,例如构建数据可视化和执行ETL任务。 在CData,我们可以轻松地将AWS Services与异构业务应用程序和分布式数据存储连接起来,以最终帮助企业对…

HTML.parser和正则解析,正则表达式+HTMLParser使用详.ppt

getText:/body getText: getText:/htmlgetText:除了前面3.2中输出的几个Tag,其余的Tag都在这里了。 3.4 XorFilter 把前面的AndFilter换成NotFilter测试代码: NodeFilter filterID new HasAttributeFilter( "id" );NodeFilter filterChild n…

FileDescriptor的作用

一、FileDescriptor 文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。文件描述符的主要实际用途是创建一个包含该结构的 FileInputStream 或 FileOutputStream。 二、静态标准文件描述…

java流与文件——内存映射文件

【0】README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——内存映射文件 的相关知识; 0.2)内存映射文件的目的是: 提高访问速度, 缓冲区Buffer; 0.3) 本文干…

java 函数式编程 示例_功能Java示例 第8部分–更多纯函数

java 函数式编程 示例这是第8部分,该系列的最后一部分称为“示例功能Java”。 我在本系列的每个部分中开发的示例是某种“提要处理程序”,用于处理文档。 在上一期文章中,我们已经使用Vavr库看到了一些模式匹配,并且还将故障也视…

html加css作品,我的影视作品,如何在博客园发布带有CSS样式的HTML

总结一下,我做过的视频:(顺便试试在博客园如何发HTML网页)发布网页总结:HTML可以正常发送,但最好将你要发布的html文件放在一个带有ID的div中,这样方便后期添加样式时通过ID添加,不会影响到网页中的其他布局…

FileInputStream

java.ioClass FileInputStream java.lang.Object java.io.InputStream java.io.FileInputStream 所有已实现的接口: Closeable public class FileInputStream extends InputStream FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。 Fil…

android console命令,我们可以通过两种方式进入Android的console: 1. 直接执行命令emulator -shell; 2....

Don’t use /usr 这样子编译出来的busybox才不会安装到你主机的/usr目录下。一定要选上。4 执行make编译源码. 如果编译过程中产生无法找到头文件的错误, 可指定交叉编译器用到的头文件所在路径. 如 $make -I./home/jo/tool/arm-2008q3/arm-none-linux-gnueabi/lib…

selenium 示例_Selenium测试中所需的功能和示例

selenium 示例所需功能是用于声明一组基本要求(例如浏览器,操作系统,浏览器版本等的组合)的类,以对Web应用程序执行自动跨浏览器测试。 当我们尝试通过Selenium自动化测试来自动化测试脚本时,我们需要考虑…