sqlite还是文件存储?
本人android小菜一枚,最近在开发一个自己的app。现在的问题,要把用户编辑后的文章(含图片,以后可能含音频)在本地存储。是sqlite还是文件IO速度快?我在数据流...
本人android小菜一枚,最近在开发一个自己的app。
现在的问题,要把用户编辑后的文章(含图片,以后可能含音频)在本地存储。
是sqlite还是文件IO速度快?
我在数据流的设计思路如下,有哪些不合理的地方?
用户编辑完一次页面确认,异步一个线程。该线程将数据实例化到BO类,然后将其持久化(到sqlite或xml文件);图片存在本地(是否安全?用户使用“猎豹清理大师”之类的时候,会不会给清掉?)。
后续还有数个需要读取该数据的功能模块。
如果sqlite,我不需要复杂的查询;如果xml,担心解析DOM耗资源。
小弟谢谢大神! 展开
现在的问题,要把用户编辑后的文章(含图片,以后可能含音频)在本地存储。
是sqlite还是文件IO速度快?
我在数据流的设计思路如下,有哪些不合理的地方?
用户编辑完一次页面确认,异步一个线程。该线程将数据实例化到BO类,然后将其持久化(到sqlite或xml文件);图片存在本地(是否安全?用户使用“猎豹清理大师”之类的时候,会不会给清掉?)。
后续还有数个需要读取该数据的功能模块。
如果sqlite,我不需要复杂的查询;如果xml,担心解析DOM耗资源。
小弟谢谢大神! 展开
3个回答
展开全部
比较好的方案是,内容结构用sqlite存,便于检索,访问也快。二进制数据(图片,音频等)用文件存本地。
比如你一篇文章的内容,我假设是这样, 分别有文本, 图片和音频内容
<record>
<title>tttttttt</title>
<content>xxxxxxxxxxxxx</content>
<image>/mnt/sdcard/yyyyy.jpg</image>
<image>/mnt/sdcard/kkk.jpg</image>
<audio>/mnt/sdcard/zzzzzzzz.amr</audio>
</record>
设计一数据库表 record,列分别是
rid 主键 int
title 文章标题 text
content 文章内容 text
再设计一个附件表attachment, 列分别是
aid 主键 int 附件的主键
rid 外键 int 关联到record
type 附件类型 int 自定义一下,比如0代表图片,1代表音频,其他可以扩展
name 附件名 text 实际上是保存时生成的MD5摘要,保证附件不重复保存
path 文件存放路径 text
这样一篇文章可以有任意数量的图片/音频和它对应,便于扩展,重复指定图片或音频,也不会重复保存。
都不需要写什么数据持久类,写一个数据封装就可以了,比如定义一个
class RecordWrapper{
public int getRecordCount(); //查询表record的记录总数
public SparseArray<String> getTitles(); //返回标题列表(这个如果太多,可以做分页)
//SparseArray稀疏数组,这个容器很方便,可以按下标像数组一样访问顺序访问,也可以按 //key-value像map一样访问,非常适合这里,key就保存记录主键,value保存title,
//遍历这个表,可以访问title,也可以映射到主键
public RecordData getRecord(int rid) ; //通过主键查询记录
public int saveRecord(RecordData record); //入库一条记录,返回主键
public void updateRecord(int rid, RecordData record); //更新记录
public void deleteRecord(int rid); //删除一条记录
}
RecordData AttachmentData分别是记录,和附件等数据封装类,这些类实际上是双重用途的
用于查询和用于入库时,其某些字段(主要是主键和附件表)内容不一定相同。
比如
class RecordData{
int rid; //用于入库时填一个负数,代表入库前主键还未知,用于查询时它是记录的主键值
String title; //标题
String context; //正文
List<AttachmentData> attachList;//附件列表,入库时它容纳待入库附件,查询时,
//返回和记录相关联的附件清单
}
class AttachmentData{
int aid;
int rid;
int type;
String name;
String path;
}
这里需要注意的一点就是name是一个用md5算法,根据附件文件数据生成的摘要字符串。
每次入库时,把附件原来的文件,复制到你的数据目录,并改名成这个摘要字符串。如果发现已经存在了,就不复制,这样就不会重复拷贝数据文件。
删除记录时,同时检查它的附件表中每一个附件,如果同名附件只有这一个了,就删除附件,如果还有其他记录使用了这个附件,就保留附件文件,只删除当前处理的附件项。
另外,只要数据不是太多(5M以内)保存单条记录都不大需要另开线程异步保存的,android还是比较快,直接存也是可以接受的。
比如你一篇文章的内容,我假设是这样, 分别有文本, 图片和音频内容
<record>
<title>tttttttt</title>
<content>xxxxxxxxxxxxx</content>
<image>/mnt/sdcard/yyyyy.jpg</image>
<image>/mnt/sdcard/kkk.jpg</image>
<audio>/mnt/sdcard/zzzzzzzz.amr</audio>
</record>
设计一数据库表 record,列分别是
rid 主键 int
title 文章标题 text
content 文章内容 text
再设计一个附件表attachment, 列分别是
aid 主键 int 附件的主键
rid 外键 int 关联到record
type 附件类型 int 自定义一下,比如0代表图片,1代表音频,其他可以扩展
name 附件名 text 实际上是保存时生成的MD5摘要,保证附件不重复保存
path 文件存放路径 text
这样一篇文章可以有任意数量的图片/音频和它对应,便于扩展,重复指定图片或音频,也不会重复保存。
都不需要写什么数据持久类,写一个数据封装就可以了,比如定义一个
class RecordWrapper{
public int getRecordCount(); //查询表record的记录总数
public SparseArray<String> getTitles(); //返回标题列表(这个如果太多,可以做分页)
//SparseArray稀疏数组,这个容器很方便,可以按下标像数组一样访问顺序访问,也可以按 //key-value像map一样访问,非常适合这里,key就保存记录主键,value保存title,
//遍历这个表,可以访问title,也可以映射到主键
public RecordData getRecord(int rid) ; //通过主键查询记录
public int saveRecord(RecordData record); //入库一条记录,返回主键
public void updateRecord(int rid, RecordData record); //更新记录
public void deleteRecord(int rid); //删除一条记录
}
RecordData AttachmentData分别是记录,和附件等数据封装类,这些类实际上是双重用途的
用于查询和用于入库时,其某些字段(主要是主键和附件表)内容不一定相同。
比如
class RecordData{
int rid; //用于入库时填一个负数,代表入库前主键还未知,用于查询时它是记录的主键值
String title; //标题
String context; //正文
List<AttachmentData> attachList;//附件列表,入库时它容纳待入库附件,查询时,
//返回和记录相关联的附件清单
}
class AttachmentData{
int aid;
int rid;
int type;
String name;
String path;
}
这里需要注意的一点就是name是一个用md5算法,根据附件文件数据生成的摘要字符串。
每次入库时,把附件原来的文件,复制到你的数据目录,并改名成这个摘要字符串。如果发现已经存在了,就不复制,这样就不会重复拷贝数据文件。
删除记录时,同时检查它的附件表中每一个附件,如果同名附件只有这一个了,就删除附件,如果还有其他记录使用了这个附件,就保留附件文件,只删除当前处理的附件项。
另外,只要数据不是太多(5M以内)保存单条记录都不大需要另开线程异步保存的,android还是比较快,直接存也是可以接受的。
2014-09-19 · 知道合伙人软件行家
关注
展开全部
sqlite是用来存一些应用数据,例如100张图片,每张图片的信息就用数据库,包括文件的路径
但是像文件,图片等资源通常内存占用非常大,通常是保存到SD卡,不会保存到数据库的
做自己的app? 要帮忙吗,刚帮人做完一个,现在有空
但是像文件,图片等资源通常内存占用非常大,通常是保存到SD卡,不会保存到数据库的
做自己的app? 要帮忙吗,刚帮人做完一个,现在有空
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
android的数据库是保存在虚拟AVD设备中的吧。(就是你给AVD分配的那块空间里)
你用adb连接上AVD设备,在从相应的路径里取出数据库文件。
是否可以解决您的问题?
你用adb连接上AVD设备,在从相应的路径里取出数据库文件。
是否可以解决您的问题?
追问
sqlite还是文件IO速度快?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询