数据持久化

一、文件
1、文件操作类

public class FileOperation {
    //保存文件,参数分别是上下文、文件名、数据
    public static void save(Context context,String filename,String data){
        FileOutputStream fileOutputStream=null;
        BufferedWriter bufferedWriter=null;
        try {
            //打开文件,这里以append方式
            fileOutputStream=context.openFileOutput(filename,Context.MODE_APPEND);
            //使用BufferWriter
            bufferedWriter=new BufferedWriter(new OutputStreamWriter(fileOutputStream));
            bufferedWriter.write(data);
            bufferedWriter.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(bufferedWriter!=null){
                    bufferedWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //读取文件,参数分别是上下文、文件名
    public static String read(Context context,String filename){
        FileInputStream fileInputStream=null;
        BufferedReader bufferedReader=null;
        StringBuffer data=new StringBuffer();

        try {
            fileInputStream=context.openFileInput(filename);
            bufferedReader=new BufferedReader(new InputStreamReader(fileInputStream));
            String line;
            while ((line=bufferedReader.readLine())!=null){
                data.append(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(bufferedReader!=null){
                    bufferedReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return data.toString();
    }
}

2、测试

public class FileActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_file);
        EditText editText=(EditText)findViewById(R.id.edit);
        Button button=(Button)findViewById(R.id.bt);
        button.setOnClickListener(
                view->{
                    String data=editText.getText().toString();
                    FileOperation.save(this,"myfile",data);//写数据
                    String str=FileOperation.read(this,"myfile");//读数据
                    Toast.makeText(this,str,Toast.LENGTH_SHORT).show();//将数据显示出来
                }
        );
    }
}

二、SharedPreferences
通过键值对来存取数据

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shared);
        Button bt=(Button)findViewById(R.id.bt_shared);
        bt.setOnClickListener(
                view -> {
                    /*
                    获得SharedPreferences对象有三种途径:
                    1、Content类的getSharedPreferences(),2个参数分别是文件名与操作模式
                    2、Activity类的getPreferences(),参数是操作模式,会自动将当前活动类名当作文件名
                    3、PreferenceManager类的getDefaultSharedPreferences(),静态方法,参数是Content
                    写数据:
                    1、通过SharedPreferences对象的edit()获得SharedPreferences.Editor对象
                    2、使用put***()向该对象中添加数据
                    3、调用apply()将添加的数据提交
                     */
                    SharedPreferences.Editor editor=getSharedPreferences("sharedfile",MODE_PRIVATE).edit();
                    editor.putString("name","yang");
                    editor.putInt("age",20);
                    editor.apply();
                }
        );

        Button show=(Button)findViewById(R.id.bt_shared_show);
        show.setOnClickListener(
                view -> {
                    /*
                    读数据:
                    1、获得SharedPreferences对象
                    2、使用get***()读数据,参数分别是键和默认返回值,当找不到该键时,就使用默认返回值
                     */
                    SharedPreferences sharedPreferences=getSharedPreferences("sharedfile",MODE_PRIVATE);
                    String data1=sharedPreferences.getString("name","lcy");
                    String data2=Integer.toString(sharedPreferences.getInt("age",20));
                    Toast.makeText(this,data1+"的年龄是"+data2,Toast.LENGTH_SHORT).show();
                }

        );
    }

三、SQLite数据库
SQLiteOpenHelper类是数据库管理帮助类,其有2个抽象方法:onCreate()与onUpgrade(),在子类中需要实现这2个方法
SQLiteOpenHelper子类:

public class SQLiteHelper extends SQLiteOpenHelper {
    private  Context context;
    
    //建表的sql语句
    String createSQL="create table info(" +
            "id text primary key," +
            "name text," +
            "class text"+
            ")";
    
    public SQLiteHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        this.context=context;
    }

    //在数据库创建的时候会执行该方法
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //在数据库建立的时候建表
        sqLiteDatabase.execSQL(createSQL);
    }

    //当构造方法里的版本号大于之前的版本号时执行此方法
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL("drop table if exists info");//将之前的表删除
        onCreate(sqLiteDatabase);//重新执行onCreate()

    }
}

对数据库进行操作:

public class SQLiteActivity extends AppCompatActivity {

    //获得一个SQLiteHelper对象
    private SQLiteHelper sqLiteHelper=new SQLiteHelper(this,"student.db",null,1);
    //数据库引用,通过其可以进行增删改查
    private SQLiteDatabase db;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sqlite);

        Button create=(Button)findViewById(R.id.database_create);
        Button add=(Button)findViewById(R.id.add) ;
        Button delete=(Button)findViewById(R.id.delete);
        Button update=(Button)findViewById(R.id.update);
        Button query=(Button)findViewById(R.id.query);
        Button databaseDelete=(Button)findViewById(R.id.database_delete);

        /*
        创建数据库或打开已存在的数据库有2个方法:
        1、getReadableDatabase(),当数据库不可写的时候,返回的对象以只读的形式访问数据库
        2、getWritableDatabase(),当数据库不可写的时候,抛出异常
        */
        db=sqLiteHelper.getReadableDatabase();

        create.setOnClickListener(
                view -> db=sqLiteHelper.getReadableDatabase()
        );

        //对应sql:db.execSQL("insert into info (id,nam,class) values(?,?,?)",new String[]{"20180001","yang","computer 1802"});
        add.setOnClickListener(
                view -> {
                    //使用ContentValues来组装数据
                    ContentValues contentValues=new ContentValues();
                    //插入第一条数据
                    contentValues.put("id","20180001");
                    contentValues.put("name","yang");
                    contentValues.put("class","computer 1801");
                    db.insert("info",null,contentValues);
                    contentValues.clear();
                    //插入第二条数据
                    contentValues.put("id","20180002");
                    contentValues.put("name","yue");
                    contentValues.put("class","math 1802");
                    db.insert("info",null,contentValues);
                }
        );

        //对应sql:db.execSQL("delete from info where id = ?",new String[]{"2018001"});
        delete.setOnClickListener(
                view -> {
                    //参数1指定表,参数2、参数3指定要删除的行
                    db.delete("info","id = ?",new String[]{"20180001"});
                }
        );

        //对应sql:db.execSQL("update info set class = ? where id=?",new String[]{"English 1802","20180002"});
        update.setOnClickListener(
                view -> {
                    //使用ContentValues组装数据
                    ContentValues contentValues=new ContentValues();
                    contentValues.put("class","English 1802");
                    //参数1指定表,参数2为ContentValues对象,指定要更改的字段及更改后的值,参数3、参数4指定要更改的行
                    db.update("info",contentValues,"id = ?",new String[]{"20180002"});
                }
        );

        //对应sql:db.rawQuery("select name,class from info",null);
        query.setOnClickListener(
                view -> {
                    /*
                    参数1:指定表
                    参数2:指定查询的字段,默认查询所有字段
                    参数3、参数4:指定查询的行,默认查询所有行
                    参数5、指定需要group by的字段,默认不进行group by操作
                    参数6:对group by之后的数据进一步过滤,默认不过滤
                    参数7:指定查询结果的排序方式,默认按照默认排序
                     */
                    Cursor cursor=db.query("info",new String[]{"name","class"},null,null,null,null,null);
                    //循环遍历cursor将数据取出来
                    if(cursor.moveToFirst()) {
                        do {
                            String name = cursor.getString(cursor.getColumnIndex("name"));
                            String clazz = cursor.getString(cursor.getColumnIndex("class"));
                            Log.d("student", name + "的班级是" + clazz);
                        } while (cursor.moveToNext());
                    }
                }
        );

        databaseDelete.setOnClickListener(
                view -> {
                    db.close();
                    File file=new File("/data/data/com.example.store/databases/student.db");            
					file.delete();                                                                      
                }
        );
    }
}

四、LitePal
Android数据库框架,采用对象关系映射模式
依赖:

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

配置LitePal:
新建文件:app->assets->litepal.xml:

<?xml version="1.0" encoding="utf-8" ?>
<litepal>
    <!-- 指定数据库名 -->
    <dbname value="student"/>
    <!-- 指定数据库版本 -->
    <version value="2"/>
    <!-- 指定映射模型 -->
    <list>
        <!--将Information添加到映射模型列表中-->
        <mapping class="com.example.store.Information"/>
    </list>

</litepal>

配置项目Application:

android:name="org.litepal.LitePalApplication"

建表:

//类名对应数据库中的表名,如果需要进行CRUD操作,则需要继承DataSupport
public class Information extends DataSupport {
    //类中的每个属性对应表中的一个字段
    //不要把属性设置为id
    private String studentId;//学号
    private String name;//姓名
    private String classes;//班级

    //getter()
    public String getStudentId() {
        return studentId;
    }
    public String getName(){
        return name;
    }
    public String getClasses(){
        return classes;
    }

    //setter()
    public void setStudentId(String studentId){
        this.studentId=studentId;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setClasses(String classes) {
        this.classes = classes;
    }
}

CRUD:

public class LitePalActivity extends AppCompatActivity {                                                                        
    private SQLiteDatabase db;                                                                                                  
                                                                                                                                
    @Override                                                                                                                   
    protected void onCreate(Bundle savedInstanceState) {                                                                        
        super.onCreate(savedInstanceState);                                                                                     
        setContentView(R.layout.activity_litepal);                                                                              
                                                                                                                                
        Button create=(Button)findViewById(R.id.database_create_litepal);                                                       
        Button add=(Button)findViewById(R.id.add_litepal) ;                                                                     
        Button delete=(Button)findViewById(R.id.delete_litepal);                                                                
        Button update=(Button)findViewById(R.id.update_litepal);                                                                
        Button query=(Button)findViewById(R.id.query_litepal);                                                                  
        Button display=(Button)findViewById(R.id.display_litepal);                                                              
        Button databaseDelete=(Button)findViewById(R.id.database_delete_litepal);                                               
                                                                                                                                
        //创建数据库,数据库名、版本等信息在litepal.xml中                                                                                         
        create.setOnClickListener(                                                                                              
                view ->{                                                                                                        
                    db=LitePal.getDatabase();                                                                                   
                                                                                                                                
                    Toast.makeText(this,"create",Toast.LENGTH_SHORT).show();                                                    
                }                                                                                                               
        );                                                                                                                      
                                                                                                                                
        //添加数据                                                                                                                  
        add.setOnClickListener(                                                                                                 
                view -> {                                                                                                       
                    Information information=new Information();                                                                  
                    //设置数据                                                                                                      
                    information.setStudentId("0001");                                                                           
                    information.setName("江离");                                                                                  
                    information.setClasses("com 01");                                                                           
                    information.save();//提交数据                                                                                   
                                                                                                                                
                    //再添加一条数据                                                                                                   
                    //如果使用上面的information,那么就只是对已存储的对象更新,而不是添加另一条数据                                                              
                    Information information1=new Information();                                                                 
                    information1.setStudentId("0002");                                                                          
                    information1.setName("阳月");                                                                                 
                    information1.setClasses("com 01");                                                                          
                    information1.save();                                                                                        
                                                                                                                                
                    Toast.makeText(this,"add",Toast.LENGTH_SHORT).show();                                                       
                }                                                                                                               
        );                                                                                                                      
                                                                                                                                
        //删除数据                                                                                                                  
        delete.setOnClickListener(                                                                                              
                view -> {                                                                                                       
                    /*                                                                                                          
                    删除数据的方法:                                                                                                    
                    1、调用已存储对象的delete()                                                                                          
                    2、DataSupport类的deleteAll()                                                                                  
                     */                                                                                                         
                    //参数1是表名,或者Class对象,如Information.class,后面的参数指定要删除的行,如果不指定,默认删除所有行                                            
                    DataSupport.deleteAll("Information","studentId = ?","0001");                                                
                                                                                                                                
                    Toast.makeText(this,"delete",Toast.LENGTH_SHORT).show();                                                    
                                                                                                                                
                }                                                                                                               
        );                                                                                                                      
                                                                                                                                
        //修改数据                                                                                                                  
        update.setOnClickListener(                                                                                              
                view -> {                                                                                                       
                    /*                                                                                                          
                    更新数据的方法:                                                                                                    
                    1、对已存储对象重新设值,然后save()                                                                                       
                    2、通过updateAll(),这种方法更加灵活                                                                                    
                     */                                                                                                         
                    Information information=new Information();                                                                  
                    //设置数据                                                                                                      
                    information.setClasses("com 02");                                                                           
                    //指定要更新的行,如果不指定的话,默认更新所有行                                                                                   
                    information.updateAll("studentId = ?","0002");                                                              
                    /*                                                                                                          
                    注意:使用此种方法时,不可以将字段更新为默认值,如int型的不能更新为0                                                                        
                    因为,创建一个对象时,其所有属性均已初始化为默认值,那么setter()是无效的                                                                    
                    而LitePal是不会对属性为默认值的字段进行更新                                                                                   
                    原因也很简单,就是这么做了会导致不想更新的字段都更新为默认值                                                                              
                    解决方法是不使用setter(),而使用setToDefault(),参数为字段名,那么在调用updateAll()时,该字段会更新为默认值                                      
                     */                                                                                                         
                                                                                                                                
                    Toast.makeText(this,"update",Toast.LENGTH_SHORT).show();                                                    
                }                                                                                                               
        );                                                                                                                      
                                                                                                                                
        //查询数据                                                                                                                  
        query.setOnClickListener(                                                                                               
                view -> {                                                                                                       
                    /*                                                                                                          
                    DataSupport类中有很多查询的方法:                                                                                      
                    1、findAll(),参数为表对应的Class对象,表示查询所有行                                                                          
                    2、findFirst(),参数为表对应的Class对象,表示查询第一行                                                                        
                    3、findLast(),与findFirst()对应                                                                                 
                    4、连缀查询:                                                                                                     
                        select()指定查询的字段                                                                                         
                        where()指定查询的行                                                                                           
                        order()指定排序方式,asc表示升序排序,desc表示降序排序,默认升序排序                                                               
                        limit()指定查询结果的数量                                                                                        
                        offset()指定查询结果的偏移量                                                                                      
                        find()指定表                                                                                               
                        以上方法,不需要的时候可以不写                                                                                         
                     */                                                                                                         
                    List<Information> list=DataSupport.select("name","classes")//查询的字段                                          
                                                      .where("studentId = ?","0001")//指定行                                       
                                                      .order("id desc")//按id降序排列                                                
                                                      .limit(2)//查询结果最多行数                                                       
                                                      .offset(0)//查询结果偏移量,这里不偏移,此方法可以不写                                         
                                                      .find(Information.class);//查询的表                                           
                                                                                                                                
                    //将数据打印出来                                                                                                   
                    for (Information line:list){                                                                                
                        Log.d("yang", line.getName()+"的班级是"+line.getClasses());                                                 
                    }                                                                                                           
                    //LitePal也支持sql:Cursor cursor=DataSupport.findBySQL(sql);                                                   
                                                                                                                                
                    Toast.makeText(this,"query",Toast.LENGTH_SHORT).show();                                                     
                }                                                                                                               
        );                                                                                                                      
                                                                                                                                
        //将所有数据显示出来                                                                                                             
        display.setOnClickListener(                                                                                             
                view -> {                                                                                                       
                    List<Information> list=DataSupport.findAll(Information.class);                                              
                    //将数据打印出来                                                                                                   
                    Log.d("yang", Integer.toString(list.size()));                                                               
                    for (Information line:list){                                                                                
                        Log.d("yang", line.getName()+"的班级是"+line.getClasses());                                                 
                    }                                                                                                           
                                                                                                                                
                    Toast.makeText(this,"display",Toast.LENGTH_SHORT).show();                                                   
                }                                                                                                               
        );                                                                                                                      
                                                                                                                                
        databaseDelete.setOnClickListener(                                                                                      
                view -> {                                                                                                       
                                                                                                                                
                    File file=new File("/data/data/com.example.store/databases/student.db");                                    
                    file.delete();                                                                                              
                                                                                                                                
                    Toast.makeText(this,"already delete the database",Toast.LENGTH_SHORT).show();                               
                }                                                                                                               
        );                                                                                                                      
    }                                                                                                                           
}                                                                                                                               

更新数据库:
将版本号增加,然后重新create就好,以前的数据会自动保存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值