`
VIP庚
  • 浏览: 223911 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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<String, SQLiteDatabase> databases = new HashMap<String, SQLiteDatabase>();

    // 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<mInstance.databases.size(); ++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");
  • 大小: 3.1 KB
0
4
分享到:
评论

相关推荐

    arcgis for android 读取加载sqlite数据库.rar

    - **JDBC连接**:使用SQLite-JDBC或其他库,建立Android应用到SQLite数据库的连接。 - **查询操作**:使用JDBC的Statement或PreparedStatement对象执行SQL查询,获取数据。 - **加载到ArcGIS**:将查询结果转换为...

    android studio使用SQLiteOpenHelper()建立数据库的方法

    今天我们讲讲在android studio中利用数据库存储中的SQLiteOpenHelper()方法建立数据库 SQLiteOpenH elper中需要重载函数: onCreate( ):利用SQL语句,在系统中创建数据库(表)功能 onUpgrade( ):利用SQL语句,...

    Flex4.6手机项目预载外部sqlite数据库

    本项目专注于在手机应用启动时预加载一个外部的SQLite数据库,以优化用户首次使用体验和减少应用程序的启动时间。 首先,我们要理解Flex 4.6在移动设备上的运行环境。Flex 4.6是Adobe AIR的一部分,它允许开发者...

    delphi android开发,带sqlite库文件发布源码

    总结来说,这个项目涉及到了使用Delphi进行Android应用开发的核心技术和SQLite数据库的集成应用,对于想要学习跨平台移动开发的Delphi程序员而言,这是一个很好的实践案例。通过深入理解并实践这个源码,你可以掌握...

    在android studio中用SQLiteOpenHelper()方法建立数据库

    今天我们讲讲在android studio中利用数据库存储中的SQLiteOpenHelper()方法建立数据库 SQLiteOpenHelper中需要重载函数: onCreate( ):利用SQL语句,在系统中创建数据库(表)功能 onUpgrade( ):利用SQL语句,在...

    Android开发直连SQL数据库

    在Android中,通常使用SQLite作为本地数据库,它是一个轻量级的关系型数据库,适用于移动设备。然而,当需要与远程SQL Server或MySQL服务器交互时,我们就需要寻找其他解决方案。这时,jtds库就派上了用场。 jtds是...

    数据库建立在sdcard的个人日记

    标题中的“数据库建立在sdcard的个人日记”指的是在Android设备的外部存储(通常是SD卡)上创建一个SQLite数据库来存储个人日记条目。SQLite是一个轻量级的关系型数据库管理系统,广泛应用于移动设备,因为它不需要...

    android SQLite开发实例

    在这个实例中,我们将深入探讨如何使用 Android 的 SQLite 数据库,以及如何通过 SQLiteOpenHelper 类进行增删查改操作。 1. **SQLiteOpenHelper 类的使用** SQLiteOpenHelper 是 Android 提供的一个关键类,用于...

    android 数据库开发 第8章_数据存储与访问.ppt

    SQLite数据库的建立包括创建数据库文件和定义表结构,常用的操作有增、删、改、查。通过SQLiteOpenHelper类,开发者可以方便地管理数据库版本,执行SQL语句进行数据操作。 ContentProvider是Android提供的一种数据...

    android对数据库进行基本操作

    本篇将详细介绍如何在Android中对SQLite数据库进行基本操作,包括创建数据库、创建表、插入数据、查询数据、更新数据以及删除数据。 首先,创建数据库。在Android中,我们通常会创建一个SQLiteOpenHelper的子类,这...

    android通过jxl读excel存入sqlite3数据库

    2. **SQLite数据库连接**:在Android中,我们通常使用SQLite作为本地数据库。首先,我们需要加载SQLite JDBC驱动并建立与数据库的连接。这可以通过`Class.forName()`加载驱动类,然后使用`DriverManager.get...

    SQLite+Database+Browser

    使用SQLite数据库浏览器,用户可以进行以下操作: 1. **连接数据库**:输入SQLite数据库文件路径,建立连接。 2. **浏览表**:查看数据库中的所有表,包括表结构(字段名、数据类型等)。 3. **查询数据**:编写SQL...

    Android简单的文件管理加杀毒 数据库是mysql

    3. **数据库(MySQL)**:虽然Android原生支持SQLite作为本地数据库,但在这个项目中选择了MySQL。MySQL是一种流行的开源关系型数据库管理系统,常用于服务器端。通过建立RESTful API,客户端可以发送HTTP请求来与...

    Android_数据库技术

    ### Android数据库技术详解 #### 一、引言 ...通过本文对Android数据库技术的详细介绍,希望能够帮助开发者更好地理解Android数据库管理的相关概念和技术要点,从而在实际项目中做出更加合理的选择。

    SQLite在windows与wince下使用的简单例子(源码、sqlite.DLL)

    在C#环境中,SQLite的集成通常依赖于SQLite.NET这样的第三方库,它提供了一套易于使用的API来操作SQLite数据库。在这个示例中,开发者可能已经包含了sqlite3.dll,这是SQLite的C接口动态链接库,通过P/Invoke技术在...

    Android 操作数据库实例-IT计算机-毕业设计.zip

    Android系统内置了SQLite数据库,它是一个轻量级的关系型数据库,适用于存储应用程序中的结构化数据。SQLite支持SQL语法,可以进行数据查询、更新、插入和删除操作。在Android中,我们通过SQLiteOpenHelper类来创建...

    安卓数据库连接例子

    首先,我们需要了解Android中的SQLite数据库,它是Android系统内置的关系型数据库,轻量级且易于使用。 **1. SQLite 数据库介绍** SQLite是一个开源的嵌入式SQL数据库引擎,无需单独的服务器进程,可以直接在应用...

    android数据库开发

    本文详细介绍了如何在Android环境下使用SQLite数据库。通过自定义的SQLite JDBC驱动,可以轻松地实现数据库连接、执行SQL语句以及处理结果集等功能。这为Android开发者提供了极大的便利,使得在移动设备上进行高效...

    Android 数据库SQLite

    9. 跨进程共享:Android的ContentProvider组件可以暴露SQLite数据库,使得不同应用间能安全地共享数据。 10. ORM框架:为了简化数据库操作,开发者可以使用ORM(Object-Relational Mapping)框架,如ORMLite、...

    数据库建立在sdcard的个人日记2

    综上所述,这个项目涉及到了Android应用开发中的SQLite数据库使用,特别是如何在SD卡上创建和管理数据库,以及如何设计和操作日记数据表。同时,也提示了权限管理和数据备份恢复的概念。开发者需要关注数据安全,...

Global site tag (gtag.js) - Google Analytics