博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅入浅出Android(010):如何将已有的sqlite数据库放入程序中
阅读量:7080 次
发布时间:2019-06-28

本文共 3799 字,大约阅读时间需要 12 分钟。

hot3.png

建数据库

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

修改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

数据库已经准备好啦

获取数据库内容

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

转载于:https://my.oschina.net/letiantian/blog/269854

你可能感兴趣的文章
Knockout应用开发指南 第五章:创建自定义绑定
查看>>
linux网络配置相关命令、虚拟网络接口eth0:0
查看>>
基于v4l2 ffmpeg x264的视频远程监控(附上编译好的库文件)
查看>>
华为登场杭州云栖大会,这是要搞事情吗?
查看>>
对方扔给你一卡车服务器,还想砍掉你50%的云成本
查看>>
获取activity上所有指定类型的控件
查看>>
rpm安装memcache
查看>>
漏洞预警:WordPress 储存型 XSS 漏洞
查看>>
RTP封装h264
查看>>
BYOD:浮躁的名词背后我们不知道的事情
查看>>
Android 7.0之访问文件的权限和FileProvider类
查看>>
安卓selinux权限修改(基于tiny4412开发板)
查看>>
Web前端和后端之区分,以及…
查看>>
前端(第一节课 HTML、CSS 、JAVAscript的概念)
查看>>
Google Interview University - 坚持完成这套学习手册,你就可以去 Google 面试了
查看>>
<Linux性能调优指南>主要思路流程
查看>>
让天下没有难做的研发效能,云效金牌合作伙伴亮相云栖大会
查看>>
C语言实现一个列表式的学生信息管理系统(完善)
查看>>
从拒绝到拥抱 企业经历云安全的六个阶段
查看>>
对话华途“少帅” 深耕数据安全市场
查看>>