文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android操作存放在assets文件夹下SQLite数据库的方法

2022-06-06 09:58

关注

本文实例讲述了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; 
 
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; 
   
  public static void initManager(Context context){ 
    if(mInstance == null){ 
      mInstance = new AssetsDatabaseManager(context); 
    } 
  } 
   
  public static AssetsDatabaseManager getManager(){ 
    return mInstance; 
  } 
  private AssetsDatabaseManager(Context context){ 
    this.context = context; 
  } 
   
  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; 
  } 
   
  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; 
  } 
   
  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开发之多媒体文件获取工具类实例【音频,视频,图片等】Android中文件读写(输入流和输出流)操作小结Android中扫描多媒体文件操作详解Android操作Excel文件的功能实现Android编程之文件读写操作与技巧总结【经典收藏】Android 文件操作方法Android 文件读写操作方法总结Android开发之SD卡文件操作分析Android开发中的文件操作工具类FileUtil完整实例


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯