Android:使用.sqlite扩展名访问资产文件夹sqlite数据库文件
如何从我的Android应用程序的.sqlite扩展名的资产文件夹sqlite数据库文件中读取数据?
试试这个代码:
public class DataBaseHelper extends SQLiteOpenHelper { private Context mycontext; //private String DB_PATH = mycontext.getApplicationContext().getPackageName()+"/databases/"; private static String DB_NAME = "(datbasename).sqlite";//the extension may be .sqlite or .db public SQLiteDatabase myDataBase; /*private String DB_PATH = "/data/data/" + mycontext.getApplicationContext().getPackageName() + "/databases/";*/ public DataBaseHelper(Context context) throws IOException { super(context,DB_NAME,null,1); this.mycontext=context; boolean dbexist = checkdatabase(); if (dbexist) { //System.out.println("Database exists"); opendatabase(); } else { System.out.println("Database doesn't exist"); createdatabase(); } } public void createdatabase() throws IOException { boolean dbexist = checkdatabase(); if(dbexist) { //System.out.println(" Database exists."); } else { this.getReadableDatabase(); try { copydatabase(); } catch(IOException e) { throw new Error("Error copying database"); } } } private boolean checkdatabase() { //SQLiteDatabase checkdb = null; boolean checkdb = false; try { String myPath = DB_PATH + DB_NAME; File dbfile = new File(myPath); //checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE); checkdb = dbfile.exists(); } catch(SQLiteException e) { System.out.println("Database doesn't exist"); } return checkdb; } private void copydatabase() throws IOException { //Open your local db as the input stream InputStream myinput = mycontext.getAssets().open(DB_NAME); // Path to the just created empty db String outfilename = DB_PATH + DB_NAME; //Open the empty db as the output stream OutputStream myoutput = new FileOutputStream("/data/data/(packagename)/databases /(datbasename).sqlite"); // transfer byte to inputfile to outputfile byte[] buffer = new byte[1024]; int length; while ((length = myinput.read(buffer))>0) { myoutput.write(buffer,0,length); } //Close the streams myoutput.flush(); myoutput.close(); myinput.close(); } public void opendatabase() throws SQLException { //Open the database String mypath = DB_PATH + DB_NAME; myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE); } public synchronized void close() { if(myDataBase != null) { myDataBase.close(); } super.close(); } }
将旧数据库(old.db)放在您的资产文件夹中。 在你的activity的onCreate()里input:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); .... //=======Code For copying Existing Database file to system folder for use====// // Copying Existing Database into system folder try { String destPath = "/data/data/" + getPackageName() + "/databases/data.db"; File f = new File(destPath); if(!f.exists()){ Log.v(TAG,"File Not Exist"); InputStream in = getAssets().open("old.db"); OutputStream out = new FileOutputStream(destPath); byte[] buffer = new byte[1024]; int length; while ((length = in.read(buffer)) > 0) { out.write(buffer, 0, length); } in.close(); out.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { Log.v("TAG","ioexeption"); e.printStackTrace(); } DBManager dbManager = new DBManager(this); Log.v(TAG,"Database is there with version: "+dbManager.getReadableDatabase().getVersion()); String sql = "select * from prizes"; SQLiteDatabase db = dbManager.getReadableDatabase(); Cursor cursor = db.rawQuery(sql, null); Log.v(TAG,"Query Result:"+cursor); cursor.close(); db.close(); dbManager.close(); .... }
现在你必须创build一个DBManager类,它是SQLiteOpenHelper的子类。 插入抽象方法和构造函数。 不要忘记在dbHelper的super()里input正确的数据库名称。
public class DBManager extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; private static final String TAG = "DATABASES"; public DBManager(Context context) { super(context, "data.db", null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { Log.v(TAG,"On create Called:"+db.getPath()); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
现在可以通过实例化DBManager来访问数据库。
SQLiteDatabase db = dbManager.getReadableDatabase(); Cursor cursor = db.rawQuery(sql, null); ...
不要忘记closures数据库,否则你会得到一个SQLiteDatabaseNotClosedexception。
db.close(); dbManager.close();
重要的是,在本教程中,当您调用文件时,请确保您传递应用程序上下文getApplicationContext()
,以便您有权访问正确的资产,否则可能会得到FileNotFoundexception。
你会想尝试android的sqlite资产助手 。 它为我打开了一个预先存在的db一块蛋糕。
我花了3个小时试图手动完成所有的工作大概半个小时。 有趣的是,我以为我在做图书馆为我做的同样的事情,但是有些东西不见了!
如果您打算创build一个新的SQLite数据库,然后搭配并实施onCreate()方法,如教程中所示。
但是,如果您正在使用另一个外部源创build的SQLite数据库,并且要将其拉下,请将onCreate()方法留空。
只能从资源文件夹读取数据库,因为资源文件夹是只读的。 如果你需要做更多的操作,如创build,更新,删除,你可以做一个技巧。 从资产文件夹复制数据库到存储,然后你可以做任何你想要的。
以下是使用Android预build数据库的一个简单示例。
从资产文件夹访问数据库也有一个易于使用的库。 你可以检查Android的SQLiteAssetHelper( https://github.com/jgilfelt/android-sqlite-asset-helper )。 祝你好运!
您需要将.sqlite数据库转换为.db才能适应Android。
在您的应用程序安装后首次启动
SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.COPY_TO_SYSTEM);
随后发射
SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.READ_FROM_DEVICE);
只需激发SQL查询
database.sqlInject("INSERT INTO food VALUES('Banana','Vitamin A');");
以CSV,JSON,XML格式获取数组结果
ArrayList<String> rows=new ArrayList<String>(); rows=database.sqlEjectCSV("SELECT * FROM food;"); for (int i=0;i<rows.size();i++) { //Do stuffs with each row }
你需要为此包括我的图书馆。 文档在这里:
https://github.com/sangeethnandakumar/TestTube