文档章节

浅入浅出Android(010):如何将已有的sqlite数据库放入程序中

樂天
 樂天
发布于 2014/05/27 19:59
字数 898
阅读 257
收藏 8

建数据库

首先,建立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



最后依次显示的是user表中的内容。
在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



© 著作权归作者所有

樂天
粉丝 138
博文 674
码字总数 147858
作品 3
深圳
程序员
私信 提问
Android 开发中使用 SQLite 数据库

SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都...

红薯
2010/08/22
67.6K
32
越写悦快乐之Android项目如何集成Room

今天的越写悦快乐之系列文章为大家带来Android项目如何集成Room的文章。做过Android开发的小伙伴都知道,Android Jetpack Components是谷歌官方推荐的构建高质量Android应用程序的利器,而R...

韬声依旧在路上
07/07
0
0
手机开发-如何查看android数据文件和数据库

在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看。android项目中的sqlite数据库位于/data/data/项目包/databases中。 工具/原料 doc命令adb工具,ecl...

娶到笨笨
2014/03/14
378
0
android是用外部sqlite文件问题求解.

有一个10m多大小的sqlite文件,要在android应用中使用它。 尝试过的方法如下: 1、把sqlite文件放入raw目录下,通过文件读写操作,将sqlite文件存入到sd卡中。这时候会出现错误:android.dat...

苏谷子
2013/06/21
1K
2
Android SMS(二)—— 读取短信保存到 SQLite

Android 之 SMS 短信在Android系统中是保存在SQLite数据库中的,但不让其它程序访问(Android系统的安全机制) 现在我们在读取手机内的SMS短信,先保存在我们自己定义的SQLite数据库中,然后...

长平狐
2013/01/06
424
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL参数search_path影响及作用

search_path稍微熟悉PG就会用到,用法这里就不必讲,本篇主要讲它在程序里怎样处理。 1、GUC参数定义 这是个 config_string 参数 {{"search_path", PGC_USERSET, CLIENT_CONN_STATEMENT,...

有理想的猪
55分钟前
8
0
Qt程序各个平台打包发布及安装程序大全

本文链接:https://blog.csdn.net/zhengtianzuo06/article/details/78468111 通用: 1.准备图标 图标可以直接使用一般格式的图片制作, 比如jpg, png等 推荐使用Photoshop制作原始图 推荐使用I...

shzwork
今天
4
0
springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
22
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
10
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部