【Anroid学习笔记】 常见持久化技术的基本使用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/A1344714150/article/details/100155915

文件存储

将数据存储到文件中

核心代码:

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/<packagename>/files/

打开方式

借助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();
}

SharedPreferens存储

三种方法获取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/<package name>/shared_prefs/

打开方式

借助Android Device Monitor工具(Tools->Android->Android Device Monitor),找到文件,

导出到电脑上,使用记事本打开,即可查看。

SQLite数据库存储

创建数据库

手写帮助类去继承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/<package name>/databases/

打开方式(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操作数据库

配置LitePal

首先需要编辑app/build.gradle文件,在dependencies闭包中添加如下内容:

dependencies{
 ... 
compile 'org.litepal.android:core:1.4.1' 
}

接下来配置litepal.xml文件,编辑litepal.xml文件如下:

<?xml version="1.0" encoding="utf-8"?> 
<litepal> 
//dbname指定数据库名 
<dbname value="BookStore"></dbname> 
//version指定数据库版本号 
<version value="1"></version> 
//list指定所有的映射模型 
<list> </list> 
</litepal>

最后配置一下LitePalApplication,修改AndroidMainifest.xml如下:

<manifest> 
//这里将项目的application配置为org.litepal.LitePalApplication,这样才能让 
//LitePal的所有功能都可以正常工作 
<application android:name="org.litepal.LitePalApplication" ...> </application> 
</manifest>

创建和升级数据库

先创建一个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中的代码如下:

<?xml version="1.0" encoding="utf-8"?> 
<litepal> 
<dbname value="BookStore"></dbname> 
<version value="1"></version> 
<list> 
//添加映射,注意一定要使用完整的类名 
<mapping class="com.example.litepaltest.Book">
</mapping> 
</list> 
</litepal>

修改MainActivity如下:

onClick(){ 
//调用LitePal.getDatabase()方法是最简单的数据库操作 
LitePal.getDatabase(); 
}

改完想改的东西后,只需要记得将版本号加1,修改litepal.xml如下:

<?xml version="1.0" encoding="utf-8"?> 
<litepal> 
<dbname value="BookStore"></dbname> 
<version value="2"></version> 
<list> 
//添加映射,注意一定要使用完整的类名 
<mapping class="com.example.litepaltest.Book"></mapping> 
<mapping class="com.example.litepaltest.Category"></mapping> 
</list> 
</litepal>

重新运行程序,发现改动成功,并且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<Book> books = DataSupport.findAll(Book.class); 
//查询表中第一条数据 
Book firstBook = DataSupport.findFirst(Book.class); 
//查询表中最后一条数据 
Book lastBook = DataSupport.findLast(Book.class); 
//连缀查询select(),指定查询列名 
List<Book> books = DataSupport.select("name","author").find(Book.class); 
//连缀查询where(),指定查询的约束条件 
List<Book> books = DataSupport.where("pages > ?","400").find(Book.class); 
//连缀查询order(),指定结果的排序方式 
List<Book> books = DataSupport.order("price desc").find(Book.class); 
//连缀查询limit(),指定查询结果的数量 
List<Book> books = DataSupport.limit(3).find(Book.class); 
//连缀查询offset(),指定查询结果的偏移量(查询第2,3,4条记录) 
List<Book> books = DataSupport.limit(3).offset(1).find(Book.class); 
//定制查询 
List<Book> 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"); 
}

猜你喜欢

转载自blog.csdn.net/A1344714150/article/details/100155915