sqlite存储大数据量数据之浅见

sqlite存储大数据量数据之浅见,第1张

概述   老猫最近刚开始学习android,android中对于数据存储的方式有好几种,经过两天的学习,对于sqlite存储数据的性能和用法做一浅显的说明:      老猫从j2me开发一路走来,对于sqlite真是喜忧参半,囍的是在一个单机PDA环境下内嵌sqlite可以利用关系型数据库对数据进行 *** 作,开发人员无须为以文本文件形式存储的数据进行查询,修改(定位而头疼),想当初三万条数据在j2me弱弱 老猫最近刚开始学习androID,androID中对于数据存储的方式有好几种,经过两天的学习,对于sqlite存储数据的性能和用法做一浅显的说明:
老猫从j2me开发一路走来,对于sqlite真是喜忧参半,囍的是在一个单机PDA环境下内嵌sqlite可以利用关系型数据库对数据进行 *** 作,开发人员无须为以文本文件形式存储的数据进行查询,修改(定位而头疼),想当初三万条数据在j2me弱弱的文本 *** 作环境下我用了将近60个文件进行存储并进行定位查询,修改 *** 作,想当然速度不会很快,一条数据的查询时间将近3到4秒。忧的是:sqlite毕竟是个内嵌的关系型数据库,它存储数据是有限的,在j2me环境下老猫曾测试存储一万条数据就开始内存溢出了,闹心呀 。
从j2me转向androID,可以看到API中对sqlite专门提供了 *** 作的接口,于是我在考虑androID环境下我如果给了它足够大的存储空间,他是否还会对我视而不见,(老猫一直认为sqlite存储较大量数据还是可以实现的,至于制约他的因素可能就是存储空间)。
这里我抛开真机或模拟器自带的内存,通过sd卡大容量的空间来存放我们的sqlite数据库。
第一:模拟器环境下:
去网站下载sqlite Expert Professiona工具,此工具是一个可视化创建sqlite数据库的工具很好用,下载地址:
安装完成后,界面如下图所示:

1、创建数据库:
在工具条栏选择file---new database,此时会d出数据库添加界面,这里我们添加data file为dictionary,给database alias( sqlite是文本数据库)添加为c:\ dictionary 添加完成后点击 Ok 按钮,此时在左侧的列表中会看到你刚刚新创建的数据库 dictionary。
2、创建表
选中dictionary右键可以看到NEW table,点击它,这里我们创建的表名为:t_wods,方式和你创建MysqL表一样,填写字段,类型,字段大小等等,这里我们创建两个字段:english,chinese,都为varchar类型长度为20。
3.录入信息,为了测试方便,我直接将两万条的数据导入到该表中,现在dictionary文件的大小为5M.
此时我们的数据库就创建完成。对于c盘下的dictionary文件,我们先放下,下面开始给模拟器创建sd卡镜像。
3、(sd卡镜像文件的创建转载于别处,谢谢原作者)
创建一个SD卡镜像文件。
打开 cmd,输入如下命令: mksdcard 1024M sdcard.img

该命令会在当前目录下生成一个sdcard.img文件,该文件就是AndroID模拟器的SD卡镜像文件。1024M表示1024兆,即该SD卡有1G的容量,也可用K做单位(1M=1024K),K,M必须大写。目前AndroID支持8M~128GSD

运行带有SD卡的模拟器
创建了 SD 卡镜像文件,只是创建了一个文件,还不能在模拟器中直接用,要在模拟器中可看到该 SD 卡,方法有两种,如下:


◆在 cmd 中,命令如下: emulator -sdcard e:sdcard.img

◆在 Eclipse 中,在 Run->Run Configurations... 菜单里面的 Target 标签页里面,输入启动参数



以上工作完成,我们可以开始写代码了:


为了测试,我只写了一个小demo,大家能看懂即可:
public class Dictionary extends Activityimplements OnClickListener,TextWatcher{
private final String DATABASE_PATH = androID.os.Environment
.getExternalStorageDirectory().getabsolutePath()
+ "/dictionary";
private final String DATABASE_filename = "dictionary.db3";
sqliteDatabase database;
button btnSelectWord;
autoCompleteTextVIEw actvWord;
@OverrIDe
public voID onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentVIEw(R.layout.main);
// 打开数据库,database是在Main类中定义的一个sqliteDatabase类型的变量
database = openDatabase();
// 下面的代码装载了相关组件,并设置了相应的事件
btnSelectWord = (button) findVIEwByID(R.ID.btnSelectWord);
actvWord = (autoCompleteTextVIEw) findVIEwByID(R.ID.actvWord);
btnSelectWord.setonClickListener(this);
actvWord.addTextChangedListener(this);
}
public voID onClick(VIEw vIEw)
{
String sql = "select chinese from t_words where english=?";
Cursor cursor = database.rawquery(sql,new String[]
{ actvWord.getText().toString() });
String result = "未找到该信息.";
//如果查找english信息,显示其chinese信息
if (cursor.getCount() > 0)
{
//必须使用movetoFirst方法将记录指针移动到第1条记录的位置
cursor.movetoFirst();
result = cursor.getString(cursor.getColumnIndex("chinese"));
Log.i("tran","success"+result);
}
//显示查询结果对话框
new AlertDialog.Builder(this).setTitle("查询结果").setMessage(result)
.setPositivebutton("关闭",null).show();

}
private sqliteDatabase openDatabase() {
try {
// 获得dictionary.db文件的绝对路径
String databasefilename = DATABASE_PATH + "/" + DATABASE_filename;
file dir = new file(DATABASE_PATH);
// 如果/sdcard/dictionary目录中存在,创建这个目录
if (!dir.exists())
dir.mkdir();
// 如果在/sdcard/dictionary目录中不存在
// dictionary.db文件,则从res\raw目录中复制这个文件到
// SD卡的目录(/sdcard/dictionary)
if (!(new file(databasefilename)).exists()) {
// 获得封装dictionary.db文件的inputStream对象
inputStream is = getResources().openRawResource(
R.raw.dictionary);
fileOutputStream fos = new fileOutputStream(databasefilename);
byte[] buffer = new byte[8192];
int count = 0;
// 开始复制dictionary.db文件
while ((count = is.read(buffer)) > 0) {
fos.write(buffer,count);
}

fos.close();
is.close();
}
// 打开/sdcard/dictionary目录中的dictionary.db文件
sqliteDatabase database = sqliteDatabase.openorCreateDatabase(
databasefilename,null);
return database;
} catch (Exception e) {
}
return null;
}
@OverrIDe
public voID afterTextChanged(Editable s) {

}
@OverrIDe
public voID beforeTextChanged(CharSequence s,int start,int count,
int after) {

}
@OverrIDe
public voID onTextChanged(CharSequence s,int before,int count) {

}

}
运行程序效果如下(该数据在库中的第20004条):

示例二(该数据在19259行)


第二、真机环境下


模拟器上测试通过,下面在真机上进行测试:
首先将,本人用的是 华为c8500 真机sd卡下新建 dictionary文件夹,然后将dictionary文件拷贝到里面,从项目目录bin文件夹下降dictionary.apk文件也拷贝到sd卡下,安装测试,由于不好切图,就不上了,总之数据也能够正常查询出来。

以上过程只是个人对中型数据量的数据做的测试观点,当然如果硬是要存储几十万上百万的数据,估计够呛,对于上面的过程有想法的朋友可以留言交流,老猫也是新手一个,谢谢大家。 总结

以上是内存溢出为你收集整理的sqlite存储大数据量数据之浅见全部内容,希望文章能够帮你解决sqlite存储大数据量数据之浅见所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

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

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存