android中使用sqlite、复制assets下的数据库到SD卡、支持大于1M的文件

如果使用SD卡,需要在AndroidManifest.xml中设置权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
1 package cn.arthur.common;
2
3  import java.io.File;
4  import java.io.FileOutputStream;
5  import java.io.IOException;
6  import java.io.InputStream;
7  import java.io.OutputStream;
8
9  import android.content.Context;
10  import android.database.sqlite.SQLiteDatabase;
11  import android.database.sqlite.SQLiteDatabase.CursorFactory;
12 import android.database.sqlite.SQLiteException;
13 import android.database.sqlite.SQLiteOpenHelper;
14
15 /**
16 * @author Joshua
17 * 用法:
18 * DBHelper dbHelper = new DBHelper(this);
19 * dbHelper.createDataBase();
20 * SQLiteDatabase db = dbHelper.getWritableDatabase();
21 * Cursor cursor = db.query()
22 * db.execSQL(sqlString);
23 * 注意:execSQL不支持带;的多条SQL语句,只能一条一条的执行,晕了很久才明白
24 * 见execSQL的源码注释 (Multiple statements separated by ;s are not supported.)
25 * 将把assets下的数据库文件直接复制到DB_PATH,但数据库文件大小限制在1M以下
26 * 如果有超过1M的大文件,则需要先分割为N个小文件,然后使用copyBigDatabase()替换copyDatabase()
27 */
28 public class DBHelper extends SQLiteOpenHelper {
29 //用户数据库文件的版本
30 private static final int DB_VERSION = 1;
31 //数据库文件目标存放路径为系统默认位置,cn.arthur.examples 是你的包名
32 private static String DB_PATH = "/data/data/cn.arthur.examples/databases/";
33 /*
34 //如果你想把数据库文件存放在SD卡的话
35 private static String DB_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath()
36 + "/arthurcn/drivertest/packfiles/";
37 */
38 private static String DB_NAME = "hello.db";
39 private static String ASSETS_NAME = "hello.db";
40
41 private SQLiteDatabase myDataBase = null;
42 private final Context myContext;
43
44 /**
45 * 如果数据库文件较大,使用FileSplit分割为小于1M的小文件
46 * 此例中分割为 hello.db.101 hello.db.102 hello.db.103
47 */
48 //第一个文件名后缀
49 private static final int ASSETS_SUFFIX_BEGIN = 101;
50 //最后一个文件名后缀
51 private static final int ASSETS_SUFFIX_END = 103;
52
53 /**
54 * 在SQLiteOpenHelper的子类当中,必须有该构造函数
55 * @param context 上下文对象
56 * @param name 数据库名称
57 * @param factory 一般都是null
58 * @param version 当前数据库的版本,值必须是整数并且是递增的状态
59 */
60 public DBHelper(Context context, String name, CursorFactory factory, int version) {
61 //必须通过super调用父类当中的构造函数
62 super(context, name, null, version);
63 this.myContext = context;
64 }
65
66 public DBHelper(Context context, String name, int version){
67 this(context,name,null,version);
68 }
69
70 public DBHelper(Context context, String name){
71 this(context,name,DB_VERSION);
72 }
73
74 public DBHelper (Context context) {
75 this(context, DB_PATH + DB_NAME);
76 }
77
78 public void createDataBase() throws IOException{
79 boolean dbExist = checkDataBase();
80 if(dbExist){
81 //数据库已存在,do nothing.
82 }else{
83 //创建数据库
84 try {
85 File dir = new File(DB_PATH);
86 if(!dir.exists()){
87 dir.mkdirs();
88 }
89 File dbf = new File(DB_PATH + DB_NAME);
90 if(dbf.exists()){
91 dbf.delete();
92 }
93 SQLiteDatabase.openOrCreateDatabase(dbf, null);
94 // 复制asseets中的db文件到DB_PATH下
95 copyDataBase();
96 } catch (IOException e) {
97 throw new Error("数据库创建失败");
98 }
99 }
100 }
101
102 //检查数据库是否有效
103 private boolean checkDataBase(){
104 SQLiteDatabase checkDB = null;
105 String myPath = DB_PATH + DB_NAME;
106 try{
107 checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
108 }catch(SQLiteException e){
109 //database does't exist yet.
110 }
111 if(checkDB != null){
112 checkDB.close();
113 }
114 return checkDB != null ? true : false;
115 }
116
117 /**
118 * Copies your database from your local assets-folder to the just created empty database in the
119 * system folder, from where it can be accessed and handled.
120 * This is done by transfering bytestream.
121 * */
122 private void copyDataBase() throws IOException{
123 //Open your local db as the input stream
124 InputStream myInput = myContext.getAssets().open(ASSETS_NAME);
125 // Path to the just created empty db
126 String outFileName = DB_PATH + DB_NAME;
127 //Open the empty db as the output stream
128 OutputStream myOutput = new FileOutputStream(outFileName);
129 //transfer bytes from the inputfile to the outputfile
130 byte[] buffer = new byte[1024];
131 int length;
132 while ((length = myInput.read(buffer))>0){
133 myOutput.write(buffer, 0, length);
134 }
135 //Close the streams
136 myOutput.flush();
137 myOutput.close();
138 myInput.close();
139 }
140
141 //复制assets下的大数据库文件时用这个
142 private void copyBigDataBase() throws IOException{
143 InputStream myInput;
144 String outFileName = DB_PATH + DB_NAME;
145 OutputStream myOutput = new FileOutputStream(outFileName);
146 for (int i = ASSETS_SUFFIX_BEGIN; i < ASSETS_SUFFIX_END+1; i++) {
147 myInput = myContext.getAssets().open(ASSETS_NAME + "." + i);
148 byte[] buffer = new byte[1024];
149 int length;
150 while ((length = myInput.read(buffer))>0){
151 myOutput.write(buffer, 0, length);
152 }
153 myOutput.flush();
154 myInput.close();
155 }
156 myOutput.close();
157 }
158
159 @Override
160 public synchronized void close() {
161 if(myDataBase != null){
162 myDataBase.close();
163 }
164 super.close();
165 }
166
167 /**
168 * 该函数是在第一次创建的时候执行,
169 * 实际上是第一次得到SQLiteDatabase对象的时候才会调用这个方法
170 */
171 @Override
172 public void onCreate(SQLiteDatabase db) {
173 }
174
175 /**
176 * 数据库表结构有变化时采用
177 */
178 @Override
179 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
180 }
181
182 }
183

===============================

android中拷贝assets下的资源文件到SD卡中(可以超过1M)

原文:http://www.cnblogs.com/wainiwann/p/3274386.html

很多手机游戏,在安装APK之后都得需要下载相应的资源包,然后才能进入游戏。

有这样一个需求:就是游戏中需要的资源包打在APK内,随apk一起进行安装到手机中。

这样就不需要,在安装APK之后,去下载资源。(这样APK的大小就会大一些)

于是在网上就开始找对应的直接访问随apk一起安装到手机中的资源。比如在assets目录下放置了一个“test.zip”的资源。当apk安装之后,可能我就需要访问这个"test.zip"资源文件。(可能我会去解压到某处)

在网上找了很长时间,说什么在assets下的资源怎么怎么不能超过1M、或者要分成多个不超过1M的小文件,然后用的时候在拼成一个大文件、说什么要用到什么数据库。总之说的,感觉没有一个有用的。

于是自己就实现了一个从assets下拷贝资源到sd卡中的一个功能。这里不限制非得拷贝到sd卡中。

之所以要拷贝出来,是因为在assets内的资源随apk安装之后,不好访问。所以想拷贝到一个容易访问的地方。比如是一个assets下的是一个zip文件,为需要在安装之后进行解压。而解压的时候我又想使用 ant.jar (支持编码) 。于是我先将zip资源拷贝到一个地方,然后在进行解压。

下面代码:

private void copyBigDataToSD(String strOutFileName) throws IOException
{
InputStream myInput;
OutputStream myOutput = new FileOutputStream(strOutFileName);
myInput = this.getAssets().open("yphone.zip");
byte[] buffer = new byte[1024];
int length = myInput.read(buffer);
while(length > 0)
{
myOutput.write(buffer, 0, length);
length = myInput.read(buffer);
} myOutput.flush();
myInput.close();
myOutput.close();
}

备注:参数为要拷贝的目的地例如“/mnt/sdcard/test/Out.zip”;

此处“myInput = cGameActivity.getAssets().open("yphone.zip"); ”open 的是你放在assets下的资源的名称。本例放的是一个叫"yphone.zip"的文件;

在进行测试的时候发现在资源文件很大时,例如200M左右,可能会报错。

但可以保证的是100M一下的没问题。

最后,此函数运行需要加权限!

android复制数据库到SD卡(网上搜集,未经验证)的更多相关文章

  1. Android -- 创建数据库到SD卡

    SQLite 系统自带的SQLite是通过SQLiteOpenHelper实现的,而SQLiteOpenHelper是将数据库存储到/data/data/包名/databasas,这样做的话在没有ro ...

  2. [android] 保存文件到SD卡

    /****************2016年5月4日 更新*****************************/ 知乎:为什么很多Android应用要把文件写到/sdcard目录下而不是写到/d ...

  3. Android数据存储之SD卡

    为了更好的存取应用程序的大文件数据,应用程序需要读. 写SD卡上的文件.SD卡大大扩充手机的存储能力. 操作SD首先要加权限: <!--在SDCard中创建与删除文件权限 --> < ...

  4. Android中播放本地SD卡中歌曲须要的加入的权限

    使用MediaPlayer播放本地Mp3文件时.须要注意的訪问路径的问题以及訪问权限的问题. 1.訪问路径:/storage/emulated/0 此路径即为手机的根路径,能够通过下载ES文件浏览器软 ...

  5. android 写文件到sd卡问题小记

    android 写文件到sd卡问题小记 事情是这样子的.... 这天我开始编写项目调试工具,高大上不?-----其实就是记录实时网络请求和崩溃日志相关等的小工具(此处一个会心的微笑). 然后我是这样写 ...

  6. Android之外部存储(SD卡)

    *手机的外部存储空间,这个我们可以理解成电脑的外接移动硬盘,U盘也行.所有的Android设备都有两个文件存储区域:“内部”和“外部”存储器.这两个名称来自早期的Android,当时大多数设备都提供内 ...

  7. Android之——清理手机SD卡缓存

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47375595 眼下,市场上非常多Android手机软件都具有清理SD卡缓存的功能, ...

  8. Android 批量上传sd卡图片

    最近手头上需要批量上传一些保存到SD卡图片由于简单,过于忘记,写在博客中吧!同时也希望能帮到大家! 一 . 以下是一个Service类 package cn.com.service; import j ...

  9. 转 Android:文件下载和写入SD卡学习小结

    转自 http://blog.csdn.net/zzp_403184692/article/details/8160739  一.文件下载  Android开发中,有时需要从网上下载一些资源以供用户使 ...

随机推荐

  1. Solaris系统管理(二)资源管理与网络配置

    上一篇主要总结了Solaris安装后需要进行的一些设置,如ssh,pkgutil管理依赖,vim安装. 这一篇将会对Solaris资源管理与网络配置进行总结. 四 Solaris 系统管理 1,查询总 ...

  2. 学习Python必须要知道的常用模块

    在程序设计中,为完成某一功能所需的一段程序或子程序:或指能由编译程序.装配程序等处理的独立程序单位:或指大型软件系统的一部分.本文为你介绍了Python中的两种常用模块. os: 这个模块包含普遍的操 ...

  3. 转-问自己:UI设计注意的十个问题

    UI 设计需要自问的 10个问题   UI 设计的魅力在于,你不仅需要适当的技巧,更要理解用户与程序的关系.一个有效的用户界面关注的是用户目标的实现,包括视觉元素与功能操作在内的所有东西都需要完整一致 ...

  4. Python的数据处理学习(二)

    本文参考Paul Barry所著的<Head First Python>一书,参考代码均可由http://python.itcarlow.ie/站点下载.本文若有任何谬误希望不吝赐教~ 二 ...

  5. poj 1004 Financial Management

    求平均数,记得之前在杭电oj上做过一个求平均数的题目,结果因为题目是英文的,我就懵逼了 #include <stdio.h> int main() { ; double num; int ...

  6. 第三百五十八天 how can I 坚持

    万事要有度,不要话唠,也不能不说,把握好分寸,今天貌似又说多了. 加了天班,理了个发,还有老爸明天来北京. 还有同学聚会没去,还有金龙让去吃鱼,没去. 还有.小米视频通话还行,能远程控制桌面, 还有, ...

  7. 内存中的static、const实现形式

    最近在考虑下半年找工作的事情,看了不少面试题目,其中还是蛮有收获的,把基础好好复习了一遍.比如这个题目,static.const现形式,static和const类型的变量在写程序的时候也写了很多,不过 ...

  8. WIFI接入Internet配置过程

    转载请注明出处:http://club.gizwits.com/thread-256-1-1.html AirLink模式GoKit2代配置路由SSID和密码方法如下:1.GoKit2上电2.长按Ke ...

  9. Java抽象类和内部类

    类(class) 类是相似对象中共同属性和方法的集合体 在面向对象中定义类,就是在描述事物,就是在定义属性(变量)和行为(方法).属性和行为共同成为类中的成员(成员变量和成员方法). 封装.继承和多态 ...

  10. 关于select @@IDENTITY的初识

    这句话主要是得到唯一的主键,然后应用于下面的SQL语句 例如代码 StringBuilder strSql=new StringBuilder(); strSql.Append("inser ...