Android使用外部SQLITE数据库

2025-10-21 20:55:03

1、一定要把数据库放到assert下,本例我放的名字是carobd.db新建AssetsDatabaseManager类,其中使用了单例设计模式

package com.zk.outdatabase;

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/com.zk.outdatabase/databases"; // %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));  

          Log.e("my","数据库已经存在此文件了");

          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();  

      }else{

     //Log.e("my","数据库已经存在此文件了");

      }

        

      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();  

      }  

  }  

2、在MainActivity中,写入操作代码

package com.zk.outdatabase;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

import com.zhangkai.sqlitedatabase.DbOpenHelper;

import android.os.Bundle;

import android.app.Activity;

import android.database.sqlite.SQLiteDatabase;

import android.util.Log;

import android.view.Menu;

public class MainActivity extends Activity {

public DbOpenHelper dbOpenHelper;

private int startbyte = 0;

private int bitnum = 0;

private int startbit = 0;

private int bitsep = 0;

private double B = 0;

int C = 0;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

// 初始化,只需要调用一次  

AssetsDatabaseManager.initManager(getApplication());  

// 获取管理对象,因为数据库需要通过管理对象才能够获取  

AssetsDatabaseManager mg = AssetsDatabaseManager.getManager();  

// 通过管理对象获取数据库  

mg.getDatabase("carobd.db");  

dbOpenHelper = new DbOpenHelper(this);

String tablename = "J1939_parainfo_CAN";

String selection = "name=?";

Map<String,String> map = new HashMap<String,String>();

String[] selectionArgs={"车速"};

map = dbOpenHelper.view(tablename, selection, selectionArgs);

Set<String> set = map.keySet();

Iterator<String> keys = set.iterator();

/*

* 打印本行所有的列值,进行查看读取。

*/

//从数据库读取相应参数。

while(keys.hasNext()){

String key = keys.next();

if(key.equals("startbyte"))

startbyte = Integer.parseInt(map.get(key));

if(key.equals("bitnum"))

bitnum = Integer.parseInt(map.get(key));

if(key.equals("startbit"))

startbit = Integer.parseInt(map.get(key));

if(key.equals("bitsep"))

bitsep = Integer.parseInt(map.get(key));

if(key.equals("B"))

B = Double.parseDouble(map.get(key));

if(key.equals("C"))

C = Integer.parseInt(map.get(key));

//String value = map.get(key);

Log.i("my","key_speed:"+key+"----value_speed:"+map.get(key));

}

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

3、运行结果图片如下:

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢