sqlite如何读取指定目录下的db文件

sqlite如何读取指定目录下的db文件,第1张

概述最近碰到apk和后台的cpp code都需要访问一个数据库的问题。结果发现apk中创建的数据库外部的进程是没有权限去读/写的。这就需要把数据库文件创建到sdcard上。 后来发现在SQLiteOpenHelper(frameworks/base/core/java/android/database/sqlite /SQLiteOpenHelper.java)这个类中,创建数据库文件的路径是使用传入 最近碰到apk和后台的cpp code都需要访问一个数据库的问题。结果发现apk中创建的数据库外部的进程是没有权限去读/写的。这就需要把数据库文件创建到sdcard上。
后来发现在sqliteOpenHelper(frameworks/base/core/java/androID/database/sqlite /sqliteOpenHelper.java)这个类中,创建数据库文件的路径是使用传入的contex的getDatabasePath获取的,这个 是不允许修改的(至少我没有找到)。
那我就仿照这个sqliteOpenHelper写了一个abstract class SDsqliteOpenHelper,其使用和sqliteOpenHelper一样,然后只要加上相应的permission,这样就可以实现把数据库存储到sdcard上了。

import java.io.file;
import androID.content.Context;
import androID.database.sqlite.sqliteDatabase;
import androID.database.sqlite.sqliteException;
import androID.database.sqlite.sqliteDatabase.CursorFactory;
import androID.util.Log;
/**
* A helper class to manage database creation and version management.
* You create a subclass implementing {@link #onCreate},{@link #onUpgrade} and
* optionally {@link #onopen},and this class takes care of opening the database
* if it exists,creating it if it does not,and upgrading it as necessary.
* Transactions are used to make sure the database is always in a sensible state.
* <p>For an example,see the NotePadProvIDer class in the NotePad sample application,
* in the <em>samples/</em> directory of the SDK.</p>
*/
public abstract class SDsqliteOpenHelper {
private static final String TAG = SDsqliteOpenHelper.class.getSimplename();
private final Context mContext;
private final String mname;
private final CursorFactory mFactory;
private final int mNewVersion;
private sqliteDatabase mDatabase = null;
private boolean mIsInitializing = false;
/**
* Create a helper object to create,open,and/or manage a database.
* The database is not actually created or opened until one of
* {@link #getWritableDatabase} or {@link #getReadableDatabase} is called.
*
* @param context to use to open or create the database
* @param name of the database file,or null for an in-memory database
* @param factory to use for creating cursor objects,or null for the default
* @param version number of the database (starting at 1); if the database is older,
* {@link #onUpgrade} will be used to upgrade the database
*/
public SDsqliteOpenHelper(Context context,String name,CursorFactory factory,int version) {
if (version < 1) throw new IllegalArgumentException("Version must be >= 1,was " + version);
mContext = context;
mname = name;
mFactory = factory;
mNewVersion = version;
}
/**
* Create and/or open a database that will be used for reading and writing.
* Once opened successfully,the database is cached,so you can call this
* method every time you need to write to the database.Make sure to call
* {@link #close} when you no longer need it.
*
* <p>Errors such as bad permissions or a full disk may cause this operation
* to fail,but future attempts may succeed if the problem is fixed.</p>
*
* @throws sqliteException if the database cannot be opened for writing
* @return a read/write database object valID until {@link #close} is called
*/
public synchronized sqliteDatabase getWritableDatabase() {
if (mDatabase != null && mDatabase.isopen() && !mDatabase.isReadonly()) {
return mDatabase;// The database is already open for business
}
if (mIsInitializing) {
throw new IllegalStateException("getWritableDatabase called recursively");
}
// If we have a read-only database open,someone Could be using it
// (though they shouldn't),which would cause a lock to be held on
// the file,and our attempts to open the database read-write would
// fail waiting for the file lock.To prevent that,we acquire the
// lock on the read-only database,which shuts out other users.
boolean success = false;
sqliteDatabase db = null;
try {
mIsInitializing = true;
if (mname == null) {
db = sqliteDatabase.create(null);
} else {
String path = getDatabasePath(mname).getPath();
db = sqliteDatabase.DatabopenorCreatease(path,mFactory);
}
int version = db.getVersion();
if (version != mNewVersion) {
db.beginTransaction();
try {
if (version == 0) {
onCreate(db);
} else {
onUpgrade(db,version,mNewVersion);
}
db.setVersion(mNewVersion);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
onopen(db);
success = true;
return db;
} finally {
mIsInitializing = false;
if (success) {
if (mDatabase != null) {
try { mDatabase.close(); } catch (Exception e) { }
}
mDatabase = db;
} else {
if (db != null) db.close();
}
}
}
/**
* Create and/or open a database.This will be the same object returned by
* {@link #getWritableDatabase} unless some problem,such as a full disk,
* requires the database to be opened read-only.In that case,a read-only
* database object will be returned.If the problem is fixed,a future call
* to {@link #getWritableDatabase} may succeed,in which case the read-only
* database object will be closed and the read/write object will be returned
* in the future.
*
* @throws sqliteException if the database cannot be opened
* @return a database object valID until {@link #getWritableDatabase}
* or {@link #close} is called.
*/
public synchronized sqliteDatabase getReadableDatabase() {
if (mDatabase != null && mDatabase.isopen()) {
return mDatabase;// The database is already open for business
}
if (mIsInitializing) {
throw new IllegalStateException("getReadableDatabase called recursively");
}
try {
return getWritableDatabase();
} catch (sqliteException e) {
if (mname == null) throw e;// Can't open a temp database read-only!
Log.e(TAG,"Couldn't open " + mname + " for writing (will try read-only):",e);
}
sqliteDatabase db = null;
try {
mIsInitializing = true;
String path = getDatabasePath(mname).getPath();
db = sqliteDatabase.openDatabase(path,mFactory,sqliteDatabase.OPEN_READWRITE);
if (db.getVersion() != mNewVersion) {
throw new sqliteException("Can't upgrade read-only database from version " +
db.getVersion() + " to " + mNewVersion + ": " + path);
}
onopen(db);
Log.w(TAG,"Opened " + mname + " in read-only mode");
mDatabase = db;
return mDatabase;
} finally {
mIsInitializing = false;
if (db != null && db != mDatabase) db.close();
}
}
/**
* Close any open database object.
*/
public synchronized voID close() {
if (mIsInitializing) throw new IllegalStateException("Closed during initialization");
if (mDatabase != null && mDatabase.isopen()) {
mDatabase.close();
mDatabase = null;
}
}

public file getDatabasePath(String name)
{
return new file("/sdcard/" + name);
}
/**
* Called when the database is created for the first time. This is where the
* creation of tables and the initial population of the tables should happen.
*
* @param db The database.
*/
public abstract voID onCreate(sqliteDatabase db);
/**
* Called when the database needs to be upgraded. The implementation
* should use this method to drop tables,add tables,or do anything else it
* needs to upgrade to the new schema version.
*
* <p>The sqlite ALTER table documentation can be found
* <a href="http://sqlite.org/lang_altertable.HTML">here</a>. If you add new columns
* you can use ALTER table to insert them into a live table. If you rename or remove columns
* you can use ALTER table to rename the old table,then create the new table and then
* populate the new table with the contents of the old table.
*
* @param db The database.
* @param oldVersion The old database version.
* @param newVersion The new database version.
*/
public abstract voID onUpgrade(sqliteDatabase db,int oldVersion,int newVersion);
/**
* Called when the database has been opened.
* OverrIDe method should check {@link sqliteDatabase#isReadonly} before
* updating the database.
*
* @param db The database.
*/
public voID onopen(sqliteDatabase db) {}
}
看看是不是对你有用!!! 总结

以上是内存溢出为你收集整理的sqlite如何读取指定目录下的db文件全部内容,希望文章能够帮你解决sqlite如何读取指定目录下的db文件所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/sjk/1176188.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-02
下一篇2022-06-02

发表评论

登录后才能评论

评论列表(0条)

    保存