如何解解析android的sqlite数据库的数据

如何解解析android的sqlite数据库的数据,第1张

安装SQLite Expert Professional 可以在网上下载,我下载的是试用版,没有找注册码,但是试用不影响使用,反正用几次查看到数据库 *** 作没有错误就不用这个工具了。当然也可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看。android项目中的sqlite数据库位于/data/data/项目包/databases中。先介绍使用DDMS导出sqlite数据库的 *** 作和使用adb工具访问sqlite数据库。

首先打开android项目的调试模式,然后找到显示DDMS

切换到DDMS,显示File Explorer窗口,找到/data/data/ 如下图1 ,

然后找到程序包的文件夹,打开databases,就能看到sqlite数据库文件了。选择将其导出。如下图2.

这样就把sqlite数据库文件以文件的方式导出来了,然后使用sqlite界面管理工具如SQLite Expert Professional可以打开该数据库了。其他 sqlite界面管理工具如sqlite administrator、sqlite man或者firefox插件sqlite manager也可以打开该数据库。

使用adb工具访问sqlite数据库

Android Debug Bridge(ADB)是Android的一个通用调试工具,它可以更新设备或模拟器中的代码,可以管理预定端口,可以在设备上运行shell命令,我们 知道android是基于Linux内核,它的内部文件结构也是采用linux文件组织方式,因此访问它的文件结构需要使用shell。这次我们就会用 shell来访问android应用中的sqlite数据库文件。

1、运行cmd,切换到android-sdk目录,运行adb.exe,加上参数shell,出现#号就代表进入了shell命令模式,注意adb要在Android模拟器运行时才能进入shell:如下图

进入数据库所在目录:

shell命令记住两个基本命令ls和cd,类似windows命令提示行中的dir和cd,代表列出当前目录下文件列表和进入到指定目录。了解这两个命令之后,就可以找到data/data/项目包名/databases 如下图1, 找到数据库文件如下图2。

使用sqlite管理工具来进行数据库 *** 作

键入sqlite3 数据库名就进入了sqlite管理模式了。

如下图

设置sqlite环境变量:

在android的sdk中自带了sqlite3.exe,这是sqlite的官方管理工具,它是一个命令行工具。为了使用方便,将其路径注册到系 统环境变量path中,即将%Android_Home%加在Path中,这样只样运行sqlite3,就能直接打开sqlite管理工具了。

如下图:

使用sqlite管理数据库:

sqlite命令行工具默认是以结束语句的。所以如果只是一行语句,要在末尾加,或者在下一行中键入,这样sqlite命令才会被执行。

sqlite常用命令:

.tables--查看数据库的表列表

.exit--退出sqlite命令行

其他命令可随时.help查看帮助。sql命令可直接在此命令行上执行即可:

其主要思路是:

1. 把数据库分解成几个asset文件。

2. 当需要打开数据库时,如果数据库不存在,就把那几个asset文件重新合并成一个数据库文件。

3. 如果数据库的版本改变了,就在onUpgrade()方法中把数据库文件删除掉。

下面是代码:

//数据库的缺省路径

private static finalString DB_PATH = "/data/data/com.mypackage.myapp/databases/"

private static finalString DB_NAME = "mydb.db"

private static finalint DB_VERSION = 2

private static finalString DB_SPLIT_NAME = "mydb.db.00"

private static finalint DB_SPLIT_COUNT = 3

private SQLiteDatabasem_database

private final Contextm_context

/**

* Constructor

*保存传进来的context参数以用来访问应用的asset和资源文件。

* @param context

*/

public MyDB(Contextcontext) {

super(context, DB_NAME, null, DB_VERSION)

this.m_context = context

}

public static MyDBopenDatabaseReadOnly(Context context) {

MyDB db = new MyDB(context)

try {

db.createDataBase()

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

db.openDataBase(SQLiteDatabase.OPEN_READONLY)

return db

}

public static MyDBopenDatabaseReadWrite(Context context) {

MyDB db = new MyDB(context)

try {

db.createDataBase()

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

db.openDataBase(SQLiteDatabase.OPEN_READWRITE)

return db

}

/**

*创建一个空数据库,用来存储你已有的数据库。

*/

public voidcreateDataBase() throws IOException{

boolean dbExist =checkDataBase()

if (dbExist) {

/*

**如果你的数据库的版本改变了,调用这个方法确保在onUpgrade()被调用时

**传进去的是可写的数据库。

*/

SQLiteDatabase db =this.getWritableDatabase()

if (db != null) {

db.close()

}

}

dbExist = checkDataBase()

if (!dbExist) {

try {

/*

** 调用这个方法以确保在缺省路径内产生一个空数据库,以便在其基础上复制我们已有的数据库。

*/

SQLiteDatabase db =this.getReadableDatabase()

if (db != null) {

db.close()

}

copyDataBase()

}

catch (IOException e) {

Log.e("DB", e.getMessage())

throw new Error("Error copyingdatabase")

}

}

}

/**

* 检查数据库是否已存在,以避免重复复制。

* @return true if it exists, false if itdoesn't

*/

private static booleancheckDataBase(){

SQLiteDatabase checkDB = null

try {

String path = DB_PATH + DB_NAME

checkDB =SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY)

}

catch (SQLiteException e){

//database does't exist yet.

}

if (checkDB != null) {

checkDB.close()

}

return checkDB != null ? true : false

}

/**

* 把存在asset文件中的数据库复制的刚创建的空数据库中。

* */

private voidcopyDataBase() throws IOException {

// 刚创建的空数据库的路径

String outFileName = DB_PATH + DB_NAME

// 打开空数据库

OutputStream output = new FileOutputStream(outFileName)

byte[] buffer = new byte[1024*8]

AssetManager assetMgr =m_context.getAssets()

for (int i = 1i <= DB_SPLIT_COUNTi++){

// 打开分解的asset文件

String fn = DB_SPLIT_NAME +String.valueOf(i)

InputStream input = assetMgr.open(fn)

//Log.i("DB", "opened" + fn)

int length

while ((length = input.read(buffer)) >0) {

//Log.i("DB", "read" + String.valueOf(length))

output.write(buffer, 0, length)

//Log.i("DB", "write" + String.valueOf(length))

}

input.close()

}

//Close the streams

output.flush()

output.close()

}

/**


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

原文地址: http://outofmemory.cn/sjk/10701408.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存