持久化

2017-08-15  本文已影响0人  TakeItEasyJQ

这只是我在学Android过程中对于所学知识的巩固和方便日后查询的学习笔记,能帮助到有需要的和我一样的初学者就更好了

数据的保存可有文件、SharedPreference、数据库等形式

文件

文件形式类似于最基本的I/O流
Context类提供了openFileOutput(String name,int MODE)方法来获取FileOutputStream对象,此方法有两个参数:
1、文件名 2、储存模式 MODE_APPEND为追加;MODE_PRIVATE为覆盖
借助BufferedWriter对象即可实现写入
同样的也有OpenFileInput(String name)来获取FileInputStream对象
借助BufferedReader即可实现读取

SharedPreferences

使用键值对的形式来保存数据,通过键即可读取值,适合保存一些常用的数据(比如天气软件中可将申请天气所用的各类id在获取时及时保存到SharedPreferences中在启动时直接提取然后自动申请最新数据)

首先获取SharedPreferences对象

有三种方法获取

SharedPreferences pref
=PreferencesManager.getDefaultSharedPreferences(Context context);
=getSharedPreferences(String name ,int MODE); //Context类
=getPreference(int MODE);//Activity类
//后两者可直接传入0,因为目前只有此一中模式可选

然后分为三部实现写入

1、调用SharedPreferences对象的edit()方法获取SharedPreferences.Editor对象editor
2、根据所需数据类型添加数据:
editor.putString(String key,String data);
editor.putBoolean(String key,Boolean data);
3、调用apply()完成数据提交
editor.apply();

Sharedpreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();
editor.putString("name","James");
editor.putInt("age",18);
editor.putBoolean("married",false);
editor.apply();

读取SharedPreferences

1、获取SharedPreferences对象 prefs
2、调用prefs的get方法即可(注意对应值的类型)

SharedPreference prefs
=PraferencesManager.getDefaultSharedPreferences(this);
String name=prefs.getString("name",null)
//参数1为键,参数2为找不到对应值是返回的默认值
int age=prefs.getInt("age",0);
boolean marride=prefs.getBoolean("marride",false);

SQLite

Android自带的轻量级数据库,可使用android的方式也可使用SQL原生语句
使用起来并不复杂

首先

新建MyHelper继承SQLiteDatabaseHelper这个抽象类,并在其中完成建表、初始化等一系列工作

public class MyHelper extends SQLiteDatabaseHelper{
    public static final String CREATE_BOOK="create table Book("
        +"id integer primary key autoincrement,"
        +"author text,"
        +"pages integer,"
        +"price real,"
        +"name text )" 
//SQL建表语句,支持类型integet(int),text(String),real(实数)等等
    private Context mcontext;
    public MyHelper(Context context ,String name ,
                                SQLiteDatabase.CursorFactory factory ,int version){
         super(context ,name ,factory ,version);
          mcontext=context;
    }
    public void onCreate(SQLiteDatabase db){  //创建上边所建的表单
        db.execSQL(CREATE_BOOK);
    }
    public void onUpgrade(SQLiteDatabase db,int oldversion,int newversion){
         //此方法在升级版本是从才会得到执行
    }
}

升级数据库

若想再在次数据库中添加新的表单
要注意创建后onCreate()就不再执行,

其次

使用时
1、获得MyHelper对象,

MyHelper helper=new MyHelper(getContex() ,"library" ,null ,1);
//context对象、数据库名字、null即可、版本号

2、

SQLiteDatabase db=helper.getReadableDatabse();
                                     =helper.getWritableDatabase();
//根据自己的需求选取

数据库升级

若想在已建立的数据库中新加表单的话,在MyHelper中新增表单是无效的,因为建立后onCreate()便不再执行,但是升级版本号onUpgrade()会执行,在此中清除表单再调用onCreate()才行。

public static final String CREATE _MAGEZINE="create table Magezine("
            +"id integer primary key autoincrement,"
            +"name text,"
            +"pages integer,"
            +"price real)"

public onCreate(SQLiteDatabase db){
    db.execSQL("CREATE_BOOK");
    db.execSQL("CREATE_MAGEZINE");
}
public onUpgrade(SQLiteDatabse db ,int oldversion, int newversion){
    db.execSQL("drop table if exists Book");    //删除之前的Book表
    onCreate(db);//重新调用onCreate()
}
helper=new MyHelper(getContext ,"library" ,null ,2);
//版本修改为比之前的大的数就可以使onUpgrade()执行

insert(String tablename ,null ,ContentValues values)

SQLiteDatabase db=myhelper.getWritableDatabase();
ContentValues values=new ContentValues();//数据的载体
values.put("name","十万个为什么");
values.put("pages",525);
values.put("price",98.55);
db.insert("Book" ,null ,values);
values.clear();

query(table ,colunm ,selection ,selectionArgs ,groupBy ,having ,orderBy)
表名、列名、列约束条件、为约束条件赋值、组、包含有、结果的排序方式

SQLiteDatabse db=myhelper.getReadableDatabse();
Cursor cursor=db.query("Book", null,"pages>?",new String[]{500},null,null,null);
//Book表中pages列数值大于500的结果保存在Cursor对象中
if(cursor.moveTofirst()){
    do{
         String name=cursor.getString(cursor.getcolumnIndex(""name));
        }while(cursor.moveToNext());
}
  //cursor的游标在查询结果第一值的前一位moveTofirst为true表示有结果
  //最后一个记过读完后moveToNext()自然是返回false从而停止循环
  cursor.close();

delete(name , 约束)

SQLiteDatabse db=new MyDatabseHelper();
db.delete("Book" ,"pages>?" ,new String[]{"500"});
//删除页数大于500的

update(name ,values ,约束)

SQLiteDatabse db=myhelper.getWritableDatabse();
ContentValues calues=new ContentValues();
values.put("name","十万个冷笑话");
db.update("Book",values,"name=?",new String[]{"十万个为什么"});

注意

1、SQLite的升级过于强硬,drop后表中的数据将全部丢失,所以一定要做好备份;
2、CRUD时一定要做好约束,否则会将虽有的数据都修改了;

开源的LitePal很好用,升级时自动保存之前的数据还能新增表单,很省事

LitePal

首先

添加依赖

compile'org.litepal.android:core:1.4.1'

其次

创建表单的类
LitePal中表就是实体类继承DataSupport类并添加所需属性

public class Book extends DataSupport{
    private int id;//id为必有的
    private String name;
    private int pages;
    private double price;
    private String author;
    GETTER ;SETTER;
}
public class Magezine extends DataSupport{
......
}

再者

配置xml文件
app/src/main→New→Directory→assets
assets→litepal.xml

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="Library"  />         //数据库名
    <version value="1"   />                  //版本
    <list>
        <mapping class="PackageName.Book"/>//表的实体类
        <mapping class="PackageName.Magezine"/>
    </list>
</litepal>

然后

AndroidManifest.xml中<application标签中初始化

android:nane="org.litepal.LitePalApplication"
//为了让litepal获取contex()

最后

使用

Book book=new Book();
book.setName("十万个为什么");
book.setprice(98.55);
book.setpages(525);
book.save();
List<Book> booklist=DataSupport.findAll(Book.class);
//查找Book表中所有元素
Book book=DataSupport.findFirst(Book.class);
//Book表中第一个元素
List<Book> booklist=DataSupport.select("name" ,"author" ,"pages")
                                                      .where("pages>?","500")
                                                      .order("pages")  //desc降序
                                                      .limit(10)             //向后查的量
                                                      .offset(10)           //偏移量
                                                      .find(Bool.class);
/*从表Book中查寻第十个元素到第二十个元素之间页数大于500的元素的name、author、pages三项数据并将结果以pages为基准做升序排列
*/

DataSupport.deleteAll(String tablename ,String seletion ,String seletionArgs)

DataSupport.deleteAll(Book.class ,"pages>?" ,"500");
Book book=new Book();
book.setName("十万个冷笑话");
book.updateAll("name=?and pages>?" ,"十万个为什么" ,"500");
升级

1、新建一个所需表的实体类
2、在assets.xml中的<litepal>的<mapping>中加入
例如<mapping class="PackageName.Student"/>
3、修改assets中version为比之前大的数字即可完成升级,不但创建了新表,之前的表及其数据也都得到了保留

结束

上一篇下一篇

猜你喜欢

热点阅读