Android的sqlite使用外部,Android 使用外部已经建立好的sqlite数据库
发布日期:2021-10-31 15:52:40 浏览次数:3 分类:技术文章

本文共 5713 字,大约阅读时间需要 19 分钟。

最近项目需要通过电话号码查询归属地,决定直接在本地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");

转载地址:https://blog.csdn.net/weixin_39987847/article/details/117588966 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:android 项目部署,Android发布项目到JCenter
下一篇:android定位会出现的问题,android – 使用GPS_PROVIDER进行定位时出现问题

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月01日 00时58分38秒