将数据存储到文件中
核心代码:
save(){
String data = "Data to save";
FileOutputStream out = null;
BufferedWriter writer = null;
try{
//通过openFileOutput()方法获取FileOutputStream的实例,
//第一个参数是文件名,第二个参数是操作模式
out = openFileOutput("data",Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(data);
}catch(IOException e){
...
}finally{
try{
if(writer!=null){
writer.close();
}
}catch(IOException e){
...
}
}
}
操作模式含义
1 Context.MODE_PRIVATE:如果文件已存在,写入的内容会覆盖原内容
2 Context.MODE_APPEND:如果文件已存在,写入的内容会在原内容的基础上进行追加
文件存储位置
/data/data/
打开方式
借助Android Device Monitor工具(Tools->Android->Android Device Monitor),找到文件,
导出到电脑上,使用记事本打开,即可查看。
从文件中读取数据
核心代码:
load(){
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try{
//通过openFileInput()方法获取FileInputStream的实例,
//传入的参数是文件名
in = openFileInput("data");
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while((line = reader.readLine())!=null){
content.append(line);
}
}catch(IOException e){
...
}finally{
if(reader!=null){
try{
read.close();
}catch(IOException e){
...
}
}
}
return content.toString();
}
三种方法获取SharedPreferences对象
1 context类中的getSharedPreferences()方法
2 Activity类中的getPreferences()方法
3 PreferenceManager类中的getDefaultSharedPreferences()方法
将数据存储到SharedPreferences文件中
核心代码:
onClick(){
//存储数据需要先获取SharedPreferences.Editor实例,接着添加数据,
//最后使用apply()进行提交
SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit(); editor.putString("name","Tom");
editor.putInt("age",28);
editor.putBoolean("married",false);
editor.apply();
}
从SharedPreferences文件中读取数据
核心代码:
onClick(){
//读取数据不需要获取
SharedPreferences.Editor SharedPreferences pref =
getSharedPreferences("data",MODE_PRIVATE);
//第一个参数是键,第二个参数是默认值(如果没找到键对应的值)
String name = pref.getString("name","");
int age = pref.getInt("age",0);
boolean married = pref.getBoolean("married",false);
Log.d("MainActivity","name is " + name);
...
}
文件存储位置
/data/data/
打开方式
借助Android Device Monitor工具(Tools->Android->Android Device Monitor),找到文件,
导出到电脑上,使用记事本打开,即可查看。
创建数据库
手写帮助类去继承SQLiteOpenHelper抽象类:
class MyDatabaseHelper extends SQLiteOpenHelper{
String create_book = "建表SQL语句";
Context mContext;
//构造方法的第一个参数是上下文环境,第二个参数是数据库名,
//第三个参数允许我们查询数据时返回自定义的Cursor,一般传入null,
//第四个参数表示当前数据库的版本号
public MyDatabaseHelper(Context context,...,...,...){
super(...,...,...,...);
mContext = context;
}
onCreate(){
//执行SQL语句
db.execSQL(create_book);
}
onUpgrade(){
...
}
}
主方法代码:
onCreate(){
dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
onClick(){
//不存在数据库时,先执行帮助类里的onCreate()方法创建数据库
dbHelper.getWriteableDatabase();
}
}
文件存储位置
/data/data/
打开方式(db后缀)
使用adb shell工具(存放在sdk的platform-tools目录下)。
配置adb shell工具
在home路径下编辑.bash文件,将platform-tools目录配置进去即可。
升级数据库
核心代码:
class MyDatabaseHelper extends SQLiteOpenHelper{
//当重新指定的数据库的版本号大于之前的数据库的版本号时,
//将执行onUpgrade()方法;
onUpgrade(){
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Book");
onCreate(db);
}
}
添加数据
核心代码:
onClick(){
SQLiteDatabase db = dbHelper.getWriteableDatabase();
ContentValues values = new ContentValues();
//添加第一条数据
values.put("name","The Da Vinci Code");
values.put("author","Dan Brown");
values.put("price",16.96);
values.put("pages",454);
//第一个参数是表名,第二个参数用于对可为空的字段自动赋值null,直接传入null
//即可,第三个参数是一个ContentValues对象
db.insert("Book",null,values);
values.clear();
//添加第二条数据
......
}
更新数据
核心代码:
onClick(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price",10.99);
//第三个参数对应SQL的where部分,?是占位符,第四个参数通过字符串数组为
//第三个参数中的每个占位符指定相应的内容
db.update("Book",values,"name = ?",new String[]{"The Da Vinci Code"});
}
删除数据
核心代码:
onClick(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
//第二个参数和第三个参数对应SQL的where部分,如果不指定则删除所有行
db.delete("Book","pages > ?",new String[]{"500"});
}
查询数据
核心代码:
onClick(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
//第一个参数指查询的表名,第二个参数指查询的列名,第三个参数指where的约束条件
//第四个参数为where中的占位符提供具体的值,第五个参数指需要group by的列,
//第六个参数对group by后的结果进一步约束,第七个参数指定查询结果的排序方式
Cursor cursor = db.query("Book",null,null,null,null,null,null);
if(cursor.moveToFirst()){
do{
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
......
}
}
}
配置LitePal
首先需要编辑app/build.gradle文件,在dependencies闭包中添加如下内容:
dependencies{
...
compile 'org.litepal.android:core:1.4.1'
}
接下来配置litepal.xml文件,编辑litepal.xml文件如下:
//dbname指定数据库名
//version指定数据库版本号
//list指定所有的映射模型
最后配置一下LitePalApplication,修改AndroidMainifest.xml如下:
//这里将项目的application配置为org.litepal.LitePalApplication,这样才能让
//LitePal的所有功能都可以正常工作
创建和升级数据库
先创建一个JavaBean:
public class Book{
private int id; private String author;
private double price;
private int pages;
private String name;
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
...
}
接下来需要将Book类添加到映射模型列表中,修改litepal.xml中的代码如下:
//添加映射,注意一定要使用完整的类名
修改MainActivity如下:
onClick(){
//调用LitePal.getDatabase()方法是最简单的数据库操作
LitePal.getDatabase();
}
改完想改的东西后,只需要记得将版本号加1,修改litepal.xml如下:
//添加映射,注意一定要使用完整的类名
重新运行程序,发现改动成功,并且LitePal还自动帮我们保留了之前表中的所有数据。
使用LitePal添加数据
进行CRUD操作时,JavaBean需要继承自DataSupport类:
class Book extends DataSupport{
...
}
接着向Book表添加数据,修改MainActivity如下:
onClick(){
Book book = new Book();
book.setName("The Da Vinci Code");
book.setAuthor("Dan Brown");
book.setPages(454);
book.setPrice(16.96);
book.setPress("Unknow");
//调用save()方法完成数据添加操作
book.save();
}
使用LitePal更新数据
只有两种情况下model.isSaved()方法会返回true。
第一种情况是已经调用过model.save()方法添加数据了,此时model会被认为是已存储的对象。
第二种情况是model是通过LitePal提供的查询API查出来的,由于是从数据库中查到的对象,因此也会被认为是已存储的对象。
第一种更新方式核心代码:
onClick(){
Book book = new Book();
book.setName("The Da Vinci Code");
book.setAuthor("Dan Brown");
book.setPages(454);
book.setPrice(16.96);
book.setPress("Unknow");
book.save();
book.setPrice(10.99);
book.save();
}
第二种更新方式核心代码:
onClick(){
Book book = new Book();
book.setPrice(14.95);
book.setPress("Anchor");
//后面两个参数对应前面的占位符
book.updateAll("name = ? and author = ?","The Lost Symbol","DanBrown");
}
如果想把一个字段的值更新为默认值,上述操作是不行的。
可以使用setToDefault()方法,然后传入相应的列名就可以实现了,如下:
Book book = new Book();
book.setDefaultTo("pages");
book.updateAll();
使用LitePal删除数据
使用LitePal删除数据主要有两种方式。
第一种方式核心代码:
Book book = new Book();
book.setName("The Da Vinci Code");
book.setAuthor("Dan Brown");
book.save();
//直接调用已存储对象的delete方法即可删除数据
book.delete();
第二种方式核心代码:
onClick(){
DataSupport.deleteAll(Book.class,"price < ?","15");
}
使用LitePal查询数据
核心代码实现:
onClick(){
//查询表中所有数据
List books = DataSupport.findAll(Book.class);
//查询表中第一条数据
Book firstBook = DataSupport.findFirst(Book.class);
//查询表中最后一条数据
Book lastBook = DataSupport.findLast(Book.class);
//连缀查询select(),指定查询列名
List books = DataSupport.select("name","author").find(Book.class);
//连缀查询where(),指定查询的约束条件
List books = DataSupport.where("pages > ?","400").find(Book.class);
//连缀查询order(),指定结果的排序方式
List books = DataSupport.order("price desc").find(Book.class);
//连缀查询limit(),指定查询结果的数量
List books = DataSupport.limit(3).find(Book.class);
//连缀查询offset(),指定查询结果的偏移量(查询第2,3,4条记录)
List books = DataSupport.limit(3).offset(1).find(Book.class);
//定制查询
List books = DataSupport.select("name","author","pages") .where("pages > ?","400").order("pages").limit(10).offset(10) .find(Book.class);
//如果实在有上述API无法满足的情况,使用原生SQL查询
Cursor c = DataSupport.findBySQL("select * from Book where pages > ? and price < ?","400","20");
}