持久化

作者: TakeItEasyJQ | 来源:发表于2017-08-15 15:17 被阅读0次

    这只是我在学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为比之前大的数字即可完成升级,不但创建了新表,之前的表及其数据也都得到了保留

    结束

    相关文章

      网友评论

          本文标题:持久化

          本文链接:https://www.haomeiwen.com/subject/ihwmrxtx.html