建数据库

首先,建立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";@Overrideprotected 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



数据库已经准备好啦



获取数据库内容



letianxiaoming



最后依次显示的是user表中的内容。
在DDMS下,可以看到 /data/data/com.example.initsqlite目录内容变为:

在第二次点击“获取数据库内容“这个按钮时,程序会依次通过Toast依次显示:
获取数据库内容
letianxiaoming

代码分析

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



更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android面试-Android项目构建
  6. Dalvikvm:在Android平台上执行.class文件
  7. Android下的数据储存方式
  8. Android(安卓)项目的创建及工程目录的介绍
  9. 【Android(安卓)界面效果4】android背景选择器selector用法汇总

随机推荐

  1. Android(安卓)获取assets的绝对路径
  2. Android(安卓)Activity之间跳转
  3. android 手机铃声获取
  4. c++ for Android(安卓)----- ndk 编译链
  5. 删除Android包
  6. android 模拟器 获取gps 值
  7. V8 android 测试
  8. android清除指定堆栈中某个activity
  9. android webview点击返回键返回上一级act
  10. Android(安卓)dex2jar反编译失败