Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android操作存放在assets文件夹下SQLite数据库的方法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

本文实例讲述了Android操作存放在assets文件夹下sqlite数据库方法分享给大家供大家参。具体如下:

因为这次的项目需要自带数据,所以就就把数据都放到一个sqlite的数据库文件中了,之后把该文件放到了assets文件夹下面。一开始打算每次都从assets文件夹下面把该文件夹拷贝到手机的SD卡或者手机自身的存储上之后再使用,后来虑到每次都拷贝的话效率不高,并且如果涉及到对数据库修改操作的话拷贝之后数据就被恢复了。

因此就写了该封装,该封装只是在第一次使用数据库文件的时候把该文件夹拷贝到手机的/data/data/应用程序报名/database文件夹下,之后就直接从这个地方使用了。并且它允许你直接通过assets文件夹下的数据库名称获取sqliteDatabase对象,这样就极大的方便了你对数据库的使用。

封装如下:

package com.sin.android.database; 
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 = "AssetsDatabase"; // 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,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(); 
    } 
  } 
} 

使用的过程也很简单,应用程序开始的时候初始化一下,之后就可以在任意地方获取管理器在通过assets文件夹下的数据库文件名直接获取sqliteDatabase对象,之后对数据库的操作就完全看你了。。。
简单的使用例子:

// 初始化,只需要调用一次 
AssetsDatabaseManager.initManager(getApplication()); 
// 获取管理对象,因为数据库需要通过管理对象才能够获取 
AssetsDatabaseManager mg = AssetsDatabaseManager.getManager(); 
// 通过管理对象获取数据库 
sqliteDatabase db1 = mg.getDatabase("db1.db"); 
// 对数据库进行操作 
db1.execsql("insert into tb([ID],[content]) values(null,'db1');"); 

需要注意的获取数据库对象的时候是区分数据库文件名的大小写的。

希望本文所述对大家的Android程序设计有所帮助。

大佬总结

以上是大佬教程为你收集整理的Android操作存放在assets文件夹下SQLite数据库的方法全部内容,希望文章能够帮你解决Android操作存放在assets文件夹下SQLite数据库的方法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:assets