建数据库
首先,建立sqlite数据库appdata.db,在其中建表填数据:CREATE TABLE user (
name TEXT
);
INSERT INTO user VALUES ('letian');
INSERT INTO user VALUES ('xiaoming');
建立Android项目
这个项目使用了eclipse + ADT + Genymotion。使用eclipse建立android项目,将appdata.db文件复制到项目的 /assets目录下。
修改布局文件/res/layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取数据库内容" />
</LinearLayout>
修改Java文件/src/com/example/initsqlite/MainActivity.java
package com.example.initsqlite;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
String DB_PATH = "/data" + Environment.getDataDirectory().getAbsolutePath()
+ "/com.example.initsqlite/databases/";
String DB_NAME = "appdata.db";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getSqliteContent();
}
});
}
/**
* 获取数据库信息
*/
public void getSqliteContent(){
File f = new File(DB_PATH + DB_NAME);
if (!f.exists()) {
prepareDB();
}
Toast.makeText(MainActivity.this, "获取数据库内容", Toast.LENGTH_SHORT).show();
SQLiteDatabase db = openOrCreateDatabase(DB_PATH+DB_NAME, Context.MODE_PRIVATE, null);
Cursor c = db.rawQuery("SELECT NAME FROM user", new String[]{});
String result = "";
while (c.moveToNext()) {
String name = c.getString(c.getColumnIndex("name"));
result = result + name + "\n";
}
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
}
/**
* 准备数据库
*/
public void prepareDB() {
if ((new File(DB_PATH+DB_NAME)).exists() == false) {
Toast.makeText(MainActivity.this, "检查到没有数据库,准备数据库ing", Toast.LENGTH_SHORT).show();
// 如 SQLite 数据库文件不存在,再检查一下 database 目录是否存在
File f = new File(DB_PATH);
// 如 database 目录不存在,新建该目录
if (!f.exists()) {
f.mkdir();
}
try {
// 得到 assets 目录下我们实现准备好的 SQLite 数据库作为输入流
InputStream is = getAssets().open(DB_NAME);
// 输出流
OutputStream os = new FileOutputStream(DB_PATH + DB_NAME);
// 文件写入
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
// 关闭文件流
os.flush();
os.close();
is.close();
Toast.makeText(MainActivity.this, "数据库已经准备好啦", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
} else {
Toast.makeText(MainActivity.this, "数据库已经存在", Toast.LENGTH_SHORT).show();
}
}
}
程序分析
运行程序,效果图如下:打开DDMS(Window->Open Perspective->DDMS),选中“File Explorer”选项卡,依次进入目录 /data/data/com.example.initsqlite,等待观察其变化。
第一次点击“获取数据库内容“这个按钮时,程序会依次通过Toast依次显示:
检查到没有数据库,准备数据库ing
数据库已经准备好啦
获取数据库内容
letian
xiaoming
在DDMS下,可以看到 /data/data/com.example.initsqlite目录内容变为:
在第二次点击“获取数据库内容“这个按钮时,程序会依次通过Toast依次显示:
获取数据库内容
letian
xiaoming
代码分析
appdata.db会被编译到apk文件之中,处理sqlite的一个常用方法是使用 openOrCreateDatabase()函数,不过这个函数需要数据库的路径作为参数,而apk中的sqlite文件无法表示成路径的形式,所以可以通过将sqlite文件复制到文件系统中解决读sqlite文件的问题。把sqlite文件复制到什么地方视需求而定。先看函数prepareDB()。先检查指定路径下是否存在这个数据库文件,如果不存在的话,首先判断是否应该创建目录,当目录存在时,将数据库文件appdata.db复制到这个目录中。
再函数getSqliteContent()。这个函数首先准备数据库(prepareDB(),这段代码有冗余,写得不好),在准备好数据后,从数据库从提取信息,并经过Toast显示之。
参考
本文部分代码参考自:http://www.cnblogs.com/yingql/archive/2011/12/12/2284841.html下面的这篇博客讲解了如何操作sqlite:http://blog.csdn.net/liuhe688/article/details/6715983
来源:oschina
链接:https://my.oschina.net/u/940565/blog/269854