Android使用外部SQLITE数据库

2025-04-23 21:21:13

1、一定要把数据库放到assert下,本例我放的名字是carobd.db新建AssetsDatabaseManager类,其中使用了单例设计模式packa爿讥旌护ge 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。
猜你喜欢