【Android】– 数据存储(一)(共享参数SharePreferences、数据库SQLite)

Android数据存储几种方式

  • SharePreferences
  • 数据库SQLite
  • 存储卡的文件操作
  • Application

目录

Android数据存储几种方式

一、共享参数

使用场景

二、数据库SQLite

1、数据定义语言(DDL)

(1)创建表格

(2)删除表格

(3)修改表结构

2、数据操纵语言(DML)

(1)添加记录

(2)删除记录

(3)修改记录

(4)查询记录

三、数据库管理器SQLiteDatabase

(1)管理类,用于数据库 层面的操作

(2)事务类,用于事务层面的操作

(3)数据处理类,用于数据表层面的操作

四、数据库帮助器SQLiteOpenHelper

一、共享参数

SharePreferences是Android的一个轻量级存储工具,采用的存储结构是Key-Value的键值对方式。

共享参数的存储介质是符合XML规范的配置文件,保存路径是:/data/data/应用包名/shared_prefs/文件名.xml

使用场景

共享参数主要适用于如下场合:

  • 简单且孤立的数据,若是复杂且相互间有关的数据,则要保存在数据库中。
  • 文本形式的数据,若是二进制数据,则要保存在文件中。
  • 需要持久化存储的数据,在APP退出后再次启动时,之前保存的数据仍然有效。

实际开发,共享参数经常存储的数据有APP的个性化配置信息、用户使用APP的行为信息、临时需要保存的片段信息等。

例:输入姓名保存到共享参数,重新打开应用会自动输入到输入框。

【Android】-- 数据存储(一)(共享参数SharePreferences、数据库SQLite)

XML文件

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp">

    <linearlayout android:layout_width="match_parent" android:layout_height="40dp" android:orientation="horizontal">
        <textview android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:text="&#x59D3;&#x540D;" android:textsize="17sp">
        <edittext android:id="@+id/et_name" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:hint="&#x8BF7;&#x8F93;&#x5165;&#x59D3;&#x540D;" android:inputtype="text" android:textsize="17sp">
</edittext></textview></linearlayout>
    <button android:id="@+id/btn_save" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="&#x4FDD;&#x5B58;&#x5230;&#x5171;&#x4EAB;&#x53C2;&#x6570;" android:textsize="17sp">
</button></linearlayout>

java文件

public class ShareWriteActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText et_name;
    private SharedPreferences preferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_share_write);
        et_name = findViewById(R.id.et_name);

        findViewById(R.id.btn_save).setOnClickListener(this);

//      &#x70B9;&#x51FB;&#x4FDD;&#x5B58;&#x5171;&#x4EAB;&#x53C2;&#x6570;&#x5219;&#x4FDD;&#x5B58;&#x6570;&#x636E;
        preferences = getSharedPreferences("config", Context.MODE_PRIVATE);
//      &#x6253;&#x5F00;&#x5E94;&#x7528;&#x4F1A;&#x68C0;&#x6D4B;&#x662F;&#x5426;&#x6709;&#x4FDD;&#x5B58;&#x8FC7;&#x7684;&#x6570;&#x636E;
        reload();
    }

    private void reload() {
        String name = preferences.getString("name",null);
        if(name != null){
            et_name.setText(name);
        }
    }

    @Override
    public void onClick(View view) {
        String name = et_name.getText().toString();

        SharedPreferences.Editor editor = preferences.edit();
        editor.putString("name",name);
        editor.commit();
    }
}

二、数据库SQLite

SQLite是一种小巧的嵌入式数据库,使用方便、开发简单,由于属于轻型数据库,不涉及复杂的数据控制操作,因此App开发只用到 数据定义和数据操纵两类SQL。

1、数据定义语言(DDL)

它描述了怎样变更数据实体的框架结构,主要包括三种操作:创建表格、删除表格、修改表结构。

(1)创建表格

语法:CREATE TABLE IF NOT EXISTS 表格名称( );

说明:

  • SQL语句不区分大小写。
  • 支持整型INTEGER,长整型LONG,字符串VARCHAR,浮点数FLOAT,但不支持布尔类型,如果使用布尔类型,true转换为1,false转换为0。
  • 为避免重复建表,应加上IF NOT EXISTS关键词。
  • 建表时需要唯一标识字段,它的字段名为id。

例:

CREATE TABLE IF NOT EXISTS user_info(
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    name VARCHAR NOT NULL
);

(2)删除表格

语法:DROP TABLE IF EXISTS 表格名称;

例:

DROP TABLE IF EXISTS user_info;

(3)修改表结构

语法:ALTER TABLE 表格名称 修改操作;

说明:

  • SQLite只支持增加字段,不支持修改字段,也不支持删除字段,对于字段增加操作,需要在alter之后补充add命令。

例:

ALTER TABLE user_info ADD COLUMN phone VARCHAR;

2、数据操纵语言(DML)

描述了怎么样处理数据实体的内部记录,表格记录的操作类型包括添加、删除、修改、查询四类。

(1)添加记录

语法:INSERT INTO 表格名称( 以逗号分隔的字段名列表 ) VALUES (以逗号分隔的字段值列表);

例:

INSERT INTO user_info (name,age,height) VALUES ('&#x5F20;',20,64);

(2)删除记录

语法:DELETE FROM 表格名称 WHERE 查询条件;

例:

DELETE FROM user_info WHERE name = '&#x5F20;';

(3)修改记录

语法:UPDATE 表格名称 SET 字段名=字段值 WHERE 查询条件;

例:

UPDATE user_info SET married=1 WHERE name='&#x5F20;';

(4)查询记录

语法:SELECT 以逗号分隔的字段名列表 FROM 表格名称 WHERE 查询条件;

例:

SELECT name FROM user_info WHERE name='&#x5F20;';

查询操作除了比较字段值条件外,还可对查询结果排序”ORDER BY 字段名 ASC或DESC”

例:

SELECT * FROM user_info ORDER BY age ASC;

三、数据库管理器SQLiteDatabase

若要在java代码中操纵SQLite,需专门的工具类,SQLiteDatabase是Android提供的SQLite数据库管理器,可调用openOrCreateDatabase方法获取数据库实例。

获取数据库实例后,可开展各项操作,提供了若干操作数据表的API,常用方法:

(1)管理类,用于数据库 层面的操作

  • openDatabase:打开指定路径的数据库。
  • isOpen:判断数据库是否已打开。
  • close:关闭数据库。
  • getVersion:获取数据库的版本号。
  • setVersion:设置数据库的版本号。

(2)事务类,用于事务层面的操作

  • beginTransaction:开始事务。
  • setTransactionSuccessful:设置事务的成功标志。
  • endTransaction:结束事务。

(3)数据处理类,用于数据表层面的操作

  • execSQL:执行拼接好的SQL控制语句。
  • delete:删除符合条件的记录。
  • update:更新符合条件的记录。
  • insert:插入一条记录。
  • query:执行查询操作,返回结果集的游标。
  • rawQuery:执行拼接好的SQL查询语句,返回结果集的游标。

例:创建、删除数据库

【Android】-- 数据存储(一)(共享参数SharePreferences、数据库SQLite)

XML文件

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">

    <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal">

        <button android:id="@+id/btn_database_create" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="&#x521B;&#x5EFA;&#x6570;&#x636E;&#x5E93;" android:textsize="17sp">

        </button><button android:id="@+id/btn_database_delete" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="&#x5220;&#x9664;&#x6570;&#x636E;&#x5E93;" android:textsize="17sp">
    </button></linearlayout>
    <textview android:id="@+id/tv_database" android:layout_width="match_parent" android:layout_height="wrap_content" android:textsize="17sp">

</textview></linearlayout>

java代码

public class DatabaseActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView tv_database;
    private String mDatabaseName;
    private String desc;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_database);
        tv_database = findViewById(R.id.tv_database);
        findViewById(R.id.btn_database_create).setOnClickListener(this);
        findViewById(R.id.btn_database_delete).setOnClickListener(this);

//        &#x751F;&#x6210;&#x4E00;&#x4E2A;&#x6D4B;&#x8BD5;&#x6570;&#x636E;&#x5E93;&#x7684;&#x5B8C;&#x6574;&#x8DEF;&#x5F84;
        mDatabaseName = getFilesDir() + "/test.db";
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
//            &#x521B;&#x5EFA;&#x6216;&#x6253;&#x5F00;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x6570;&#x636E;&#x5E93;&#x5982;&#x679C;&#x4E0D;&#x5B58;&#x5728;&#x5219;&#x521B;&#x5EFA;
            case R.id.btn_database_create:
               SQLiteDatabase db = openOrCreateDatabase(mDatabaseName, Context.MODE_PRIVATE,null);
                desc = String.format("&#x6570;&#x636E;&#x5E93;%s&#x521B;&#x5EFA;%s",db.getPath(),(db != null) ? "&#x6210;&#x529F;":"&#x5931;&#x8D25;");
                tv_database.setText(desc);
                break;
            case R.id.btn_database_delete:
                //&#x5220;&#x9664;&#x6570;&#x636E;&#x5E93;
                boolean result = deleteDatabase(mDatabaseName);
                desc = String.format("&#x6570;&#x636E;&#x5E93;%s&#x5220;&#x9664;%s",mDatabaseName,result? "&#x6210;&#x529F;":"&#x5931;&#x8D25;");
                tv_database.setText(desc);
                break;
        }
    }
}

四、数据库帮助器SQLiteOpenHelper

SQLiteOpenHelper是Android提供的数据库辅助工具,用于指导开发者进行SQLite的合理使用。

使用步骤:

  • 新建继承SQLiteOpenHelper的数据库操作类,提示重写onCreate和onUpgrade两个方法。
  • 封装保证数据库安全的必要方法。
  • 提供对表记录进行增加、删除、修改、查询的操作方法。

例:添加到数据库中

【Android】-- 数据存储(一)(共享参数SharePreferences、数据库SQLite)

创建database包,包下创建java类

public class UserDBHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "user.db";
    private static final String TABLE_NAME = "user_info";
    private static final int DB_VERSION = 1;
    private static UserDBHelper mHelper = null;
    private SQLiteDatabase mRDB = null;
    private SQLiteDatabase mWDB = null;

    private UserDBHelper(Context context){
        super(context,DB_NAME,null,DB_VERSION);
    }
//    &#x5229;&#x7528;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;&#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x5E2E;&#x52A9;&#x5668;&#x7684;&#x552F;&#x4E00;&#x5B9E;&#x4F8B;
    public static UserDBHelper getInstance(Context context){
        if(mHelper == null){
            mHelper = new UserDBHelper(context);
        }
        return mHelper;
    }
//    &#x6253;&#x5F00;&#x6570;&#x636E;&#x5E93;&#x7684;&#x8BFB;&#x8FDE;&#x63A5;
    public SQLiteDatabase openReadLink(){
        if(mRDB == null || !mRDB.isOpen()){
            mRDB = mHelper.getReadableDatabase();
        }
        return mRDB;
    }
//    &#x6253;&#x5F00;&#x5199;&#x8FDE;&#x63A5;
    public SQLiteDatabase openWriteLink(){
        if(mWDB == null || !mWDB.isOpen()){
            mWDB = mHelper.getWritableDatabase();
        }
        return mWDB;
    }
//    &#x5173;&#x95ED;&#x6570;&#x636E;&#x5E93;&#x8FDE;&#x63A5;
    public void closeLink(){
        if(mRDB != null && mRDB.isOpen()){
            mRDB.close();
            mRDB = null;
        }
        if(mWDB != null && mWDB.isOpen()){
            mWDB.close();
            mWDB = null;
        }
    }
//    &#x521B;&#x5EFA;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x6267;&#x884C;&#x5EFA;&#x8868;&#x8BED;&#x53E5;
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE IF NOT EXISTS "+TABLE_NAME+"(" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +
                "name VARCHAR NOT NULL);";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }

    public long insert(User user){
        ContentValues values = new ContentValues();
        values.put("name",user.name);
        return mWDB.insert(TABLE_NAME,null,values);
    }
}

XML文件

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp">

    <linearlayout android:layout_width="match_parent" android:layout_height="40dp" android:orientation="horizontal">
        <textview android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:text="&#x59D3;&#x540D;" android:textsize="17sp">
        <edittext android:id="@+id/et_name" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:hint="&#x8BF7;&#x8F93;&#x5165;&#x59D3;&#x540D;" android:inputtype="text" android:textsize="17sp">
    </edittext></textview></linearlayout>
    <button android:id="@+id/btn_add" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="&#x6DFB;&#x52A0;" android:textsize="17sp">
</button></linearlayout>

Userjava类

public class User {
    public int id;
    public String name;
    public User(){

    }
    public User(String name){
        this.name = name;
    }
}

Activity java类

public class SQLiteHelperActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView et_name;
    private UserDBHelper mHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sqlite_helper);
        et_name = findViewById(R.id.et_name);
        findViewById(R.id.btn_add).setOnClickListener(this);
    }

    @Override
    protected void onStart() {
        super.onStart();
//        &#x6253;&#x5F00;&#x6570;&#x636E;&#x5E93;&#x5E2E;&#x52A9;&#x5668;&#x7684;&#x5B9E;&#x4F8B;
        mHelper = UserDBHelper.getInstance(this);
//        &#x6253;&#x5F00;&#x6570;&#x636E;&#x5E93;&#x5E2E;&#x52A9;&#x5668;&#x7684;&#x8BFB;&#x5199;&#x8FDE;&#x63A5;
        mHelper.openWriteLink();
        mHelper.openReadLink();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mHelper.closeLink();
    }

    @Override
    public void onClick(View view) {
        String name = et_name.getText().toString();
        User user = null;
        switch (view.getId()){
            case R.id.btn_add:
//                &#x4EE5;&#x4E0B;&#x58F0;&#x660E;&#x4E00;&#x4E2A;&#x7528;&#x6237;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#xFF0C;&#x5E76;&#x586B;&#x5199;&#x5B83;&#x7684;&#x5404;&#x5B57;&#x6BB5;&#x503C;
                user = new User(name);
                if(mHelper.insert(user)>0){
                    Toast.makeText(this,"&#x6DFB;&#x52A0;&#x6210;&#x529F;",Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
}

Original: https://blog.csdn.net/Tir_zhang/article/details/127029669
Author: Shewyoo
Title: 【Android】– 数据存储(一)(共享参数SharePreferences、数据库SQLite)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/815124/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球