Android SQLite之乐学成语项目数据库存储
一、SQLite是什么?为什么要用SQLite?SQLite有什么特点?(下面小编一 一解答)
①SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,很适合在移动设备上使用, 不仅支持 标准SQL语法,还遵循ACID(数据库事务)原则,无需账号,使用起来非 常方便!
②前面我们学习了使用文件与SharedPreference来保存数据,但是在很多情况下, 文件并不 一定是有效的,如多线程并发访问是相关的;app要处理可能变化的复杂数据结构等等! 比如银行的存钱与取钱!使用前两者就会显得很无力或者繁琐,数据库的出现可以解决这种问题, 而Android又给我们提供了这样一个轻量级的SQLite,为何不用?
③SQLite支持五种数据类型:NULL,INTEGER,REAL(浮点数),TEXT(字符串文本)和BLOB(二进制对象)虽然只有五种,但是对于varchar,char等其他数据类型都是可以保存的;SQLite有个最大的特点: 你可以各种数据类型的数据保存到任何字段中而不用关心字段声明的数据类型是什么,比如你 可以在Integer类型的字段中存放字符串,当然除了声明为主键INTEGER PRIMARY KEY的字段只能够存储64位整数!另外, SQLite 在解析CREATE TABLE 语句时, 会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息如下面语句会忽略 name字段的类型信息: CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
二、几个相关的类
- SQLiteOpenHelper:抽象类,我们通过继承该类,然后重写数据库创建以及更新的方法, 我们还可以通过该类的对象获得数据库实例,或者关闭数据库!
- SQLiteDatabase:数据库访问类:我们可以通过该类的对象来对数据库做一些增删改查的操作
- Cursor:游标,有点类似于JDBC里的resultset,结果集!可以简单理解为指向数据库中某 一个记录的指针!
三、SQLiteDdatabase相关的方法
- execSQL(SQL,Object[]):使用带占位符的SQL语句,这个是执行修改数据库内容的sql语句用的
- rawQuery(SQL,Object[]):使用带占位符的SQL查询操作 另外前面忘了介绍下Curosr这个东西以及相关属性,这里补充下: ——Cursor对象有点类似于JDBC中的ResultSet,结果集!使用差不多,提供一下方法移动查询结果的记录指针:
- move(offset):指定向上或者向下移动的行数,整数表示向下移动;负数表示向上移动!
- moveToFirst():指针移动到第一行,成功返回true,也说明有数据
- moveToLast():指针移动到最后一样,成功返回true;
- moveToNext():指针移动到下一行,成功返回true,表明还有元素!
- moveToPrevious():移动到上一条记录
- getCount( )获得总得数据条数
- isFirst():是否为第一条记录
- isLast():是否为最后一项
- moveToPosition(int):移动到指定行
四、 代码实例
android的数据库放在/data/data/package name/目录下,所以我们需要做的是把自己已有的数据库传入那个目录下,思路是用FileInputStream读取数据库,再用FileOutputStream把读到的东西写入那个目录。这样就可以方便的操作数据库了。
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import com.bzu.qilu.R; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.os.Environment; import android.util.Log; /**数据库管理类 * @author 刘齐鲁 *date 2016-5-20 */ public class DBOpenHelper { private final int BUFFER_SIZE = 400000;//缓冲区大小 public static final String DB_NAME="idioms.db";//保存的数据库文件名 public static final String PACKAGE_NAME="com.bzu.qilu";//应用包名 public static final String DB_PATH="/data" + Environment.getDataDirectory().getAbsolutePath()+"/" + PACKAGE_NAME+"/databases";//在手机里存放数据库的位置 private Context context; public DBOpenHelper(Context context){ this.context=context; } //打开数据库 public SQLiteDatabase openDatabase(){ try{ File myDataPathFile = new File(DB_PATH);// if(!myDataPathFile.exists()){ myDataPathFile.mkdir();//如果没有这个目录则创建 } String dbfile = myDataPathFile+"/"+DB_NAME; if(!(new File(dbfile).exists())){ //判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库 InputStream is = context.getResources().openRawResource(R.raw.idioms); FileOutputStream fos = new FileOutputStream(dbfile); byte[] buffer = new byte[BUFFER_SIZE]; int count = 0; while((count =is.read(buffer))>0){ fos.write(buffer,0,count); } fos.close(); is.close(); } SQLiteDatabase db =SQLiteDatabase .openOrCreateDatabase(dbfile, null); return db; }catch(FileNotFoundException e){ Log.e("Database", "File not found"); e.printStackTrace(); }catch(IOException e){ Log.e("Database", "IO exception"); e.printStackTrace(); } return null; } }
编写测试程序:
public class DBOpenHelperTest extends AndroidTestCase { public void testDBCopy(){ DBOpenHelper dbOpenHelper = new DBOpenHelper(getContext()); dbOpenHelper.openDatabase(); } }
会出现下面界面:
我们在这个FileExplorer目录下找到数据库存放的位置
我们发现数据库有两个,前者是我们创建的数据库,而后者则是为了能让数据库支持事务而产生的 临时的日志文件!一般的大小是0字节! 而在File Explorer里我们确是打不开文件的。所以下面给大家介绍两个方法:
- 1.先导出来,然后用SQLite的图形化工具查看
- 2.配置adb环境变量后,通过adb shell来查看(命令行,装比利器)!