Android开发--数据存储

Android中有5种存储方式:

  1. 使用SharedPreferences存储数据
  2. 文件存储数据
  3. SQLite数据库存储数据
  4. 使用ContentProvider存储数据
  5. 网络存储数据

1.SharedPreferences

使用方法:

  • edit()开始编辑
  • apply()和commit()提交数据;apply()效率快,线程安全;commit()效率慢,线程不安全。推荐使用apply()
  • getXXX() 获取数据
  • remove(“ ”)删除指定数据
  • clear() 清空数据

简单示例:

//sp保存数据
    SharedPreferences sharedPreferences;
    private EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //创建sp
        sharedPreferences=getSharedPreferences("config",MODE_PRIVATE);
        editText=(EditText) findViewById(R.id.editText);
        //读取保存的数据,写到editText
        //取数据,参数2为找不到“data”,key默认返回的数据
        String data=sharedPreferences.getString("data","");
        editText.setText(data);
    }

    //保存数据
    public void saveData(View view){
        //1 获取输入的内容
        String data=editText.getText().toString();
        //2 获取到编辑器
        SharedPreferences.Editor editor=sharedPreferences.edit();
        //3 保存数据
        editor.putString("data",data);
        //4 保存到文件
//        editor.commit();//效率慢,线程安全
        editor.apply();//效率快,线程不安全
    }

    //删除指定数据
    public void deleteData(View view){
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.remove("data");
//        editor.commit();//效率慢,线程安全
        editor.apply();//效率快,线程不安全
    }

    //清空数据
    public void clearData(View view){
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.clear();
//        editor.commit();//效率慢,线程安全
        editor.apply();//效率快,线程不安全
    }

2.SQLite

SQLite是一款轻量级的数据库,提供了操控数据库的封装类,CRUD(添加(Create)、查询(Retrieve)、更新(Update)、删除(Delete))。

1.创建数据库:提供SQLiteOpenHelper抽象类,常用的方法:onCreate--数据库创建时执行;onUpgrade--数据库更新时执行;

onOpen--数据库每次打开执行

public class PersonOpenHelper extends SQLiteOpenHelper {

    /**创建Person表的SQL语句*/
    public static final String CREATE_PERSON="create table person_info(" +
            "  id integer primary key autoincrement," +
            "  person_name varchar(20)," +
            "  age integer(10)," +
            "  phone varchar(20));";

    public PersonOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        // 数据库创建时执行 一般只执行一次
        sqLiteDatabase.execSQL(CREATE_PERSON); // 执行创建表的SQL语句
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        // 数据库更新时执行
        // 删除之前的person_info表
        if (oldVersion == 1 && newVersion == 2) {
            sqLiteDatabase.execSQL("alter table person_info add column phone varchar(20)");
        }
    }
}

2.数据库增删改查(CURD)

public SQLiteDatabase getDataBase() {
    PersonOpenHelper openHelper = new PersonOpenHelper(this, "person.db", null, 2);
    return openHelper.getWritableDatabase();
}

(1)添加(Create)

  SQL语句:insert into person(name,age,phone) values(?,?,?)

public void insert(View v) {
    //获取数据库对象
    SQLiteDatabase dataBase = getDataBase();
    // ? 为占位符
    String sql = "insert into person(name,age,phone) values(?,?,?)";
    //执行sql语句 通过 Object[] 依次用实际数据替换sql语句中的 ?占位符
    dataBase.execSQL(sql, new Object[]{"zhangsan", "10", "13333333333"});
    //关闭数据库,回收资源
    dataBase.close();
}

(2)修改(Update)

SQL语句:update person_info set age=? where person_name=?

public void update(View v) {
    SQLiteDatabase dataBase = getDataBase();
    String sql = "update person_info set age=? where person_name=?";
    //将 zhangsan 的年龄修改为 20
    dataBase.execSQL(sql, new String[]{"20", "zhangsan"});
    dataBase.close();
}

(3)查询(Retrieve)

SQL语句:select person_name,age,phone from person_info where person_name=?

public void query(View v) {
    SQLiteDatabase dataBase = getDataBase();
    String sql = "select person_name,age,phone from person_info where person_name=?";
    //执行 rawQuery 查询,返回 Cursor 对象
    Cursor cursor = dataBase.rawQuery(sql, new
            String[]{"zhangsan"});
    ////如果游标还有下一个元素,跟我们集合中 Iterator 中 hasNext()方法类似
    if (cursor.moveToNext()) {
        //获取当前游标的第 0 个元素,元素是从 0 开始的,而不是 1
        String person_name = cursor.getString(0);
        //也可以通过列名来查询该字段在游标中的位置
        int age = cursor.getInt(cursor.getColumnIndex("age"));
        String phone = cursor.getString(2);
        // 输出结果
        Log.i("result", person_name + "..." + age + "..." + phone);
    }
    //关闭游标
    cursor.close();
}

(4)删除(Delete)

SQL语句:delete from person_info where person_name=?

public void delete(View v) {
    SQLiteDatabase dataBase = getDataBase();
     dataBase.execSQL("delete from person_info where person_name=?",new Object[]{"zhangsan"});
    dataBase.delete("person_info", "person_name=?", new String[]{"zhangsan"});
    dataBase.close();
}

注:开发中常用第三方框架来存储数据,常见的有:GreenDao、realm、ActiveAndroid、LitePal、OrmLite;推荐使用GreenDao,运行效率高,内存消耗小,性能佳。

GreenDao的使用:https://blog.csdn.net/qq_36699930/article/details/81540781

发布了20 篇原创文章 · 获赞 1 · 访问量 2811

猜你喜欢

转载自blog.csdn.net/baidu_27603429/article/details/93379396