Android SharePreferences与数据库SQLite存储实现方法介绍

作者:Shewyoo 时间:2023-03-13 11:20:45 

Android数据存储几种方式

  • SharePreferences

  • 数据库SQLite

  • 存储卡的文件操作

  • Application

一、共享参数

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="姓名"
           android:textSize="17sp"/>
       <EditText
           android:id="@+id/et_name"
           android:layout_width="0dp"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:hint="请输入姓名"
           android:inputType="text"
           android:textSize="17sp"/>
</LinearLayout>
   <Button
       android:id="@+id/btn_save"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="保存到共享参数"
       android:textSize="17sp"/>
</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);
//      点击保存共享参数则保存数据
       preferences = getSharedPreferences("config", Context.MODE_PRIVATE);
//      打开应用会检测是否有保存过的数据
       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 ('张',20,64);

(2)删除记录

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

例:

DELETE FROM user_info WHERE name = '张';

(3)修改记录

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

例:

UPDATE user_info SET married=1 WHERE name='张';

(4)查询记录

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

例:

SELECT name FROM user_info WHERE name='张';

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

例:

SELECT * FROM user_info ORDER BY age ASC;

三、数据库管理器SQLiteDatabase

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

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

管理类

用于数据库 层面的操作

  • openDatabase:打开指定路径的数据库。

  • isOpen:判断数据库是否已打开。

  • close:关闭数据库。

  • getVersion:获取数据库的版本号。

  • setVersion:设置数据库的版本号。

事务类

  • 用于事务层面的操作 beginTransaction:开始事务。

  • setTransactionSuccessful:设置事务的成功标志。

  • endTransaction:结束事务。

数据处理类

用于数据表层面的操作

  • execSQL:执行拼接好的SQL控制语句。

  • delete:删除符合条件的记录。

  • update:更新符合条件的记录。

  • insert:插入一条记录。

  • query:执行查询操作,返回结果集的游标。

  • rawQuery:执行拼接好的SQL查询语句,返回结果集的游标。

例:创建、删除数据库

Android SharePreferences与数据库SQLite存储实现方法介绍

Android SharePreferences与数据库SQLite存储实现方法介绍

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="创建数据库"
           android:textSize="17sp"/>
       <Button
           android:id="@+id/btn_database_delete"
           android:layout_width="0dp"
           android:layout_height="wrap_content"
           android:layout_weight="1"
           android:text="删除数据库"
           android:textSize="17sp"/>
   </LinearLayout>
   <TextView
       android:id="@+id/tv_database"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:textSize="17sp"/>
</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);
//        生成一个测试数据库的完整路径
       mDatabaseName = getFilesDir() + "/test.db";
   }
   @Override
   public void onClick(View view) {
       switch (view.getId()){
//            创建或打开数据库,数据库如果不存在则创建
           case R.id.btn_database_create:
              SQLiteDatabase db = openOrCreateDatabase(mDatabaseName, Context.MODE_PRIVATE,null);
               desc = String.format("数据库%s创建%s",db.getPath(),(db != null) ? "成功":"失败");
               tv_database.setText(desc);
               break;
           case R.id.btn_database_delete:
               //删除数据库
               boolean result = deleteDatabase(mDatabaseName);
               desc = String.format("数据库%s删除%s",mDatabaseName,result? "成功":"失败");
               tv_database.setText(desc);
               break;
       }
   }
}

四、数据库帮助器SQLiteOpenHelper

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

使用步骤:

  • 新建继承SQLiteOpenHelper的数据库操作类,提示重写onCreate和onUpgrade两个方法。

  • 封装保证数据库安全的必要方法。

  • 提供对表记录进行增加、删除、修改、查询的操作方法。

例:添加到数据库中

Android SharePreferences与数据库SQLite存储实现方法介绍

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);
   }
//    利用单例模式获取数据库帮助器的唯一实例
   public static UserDBHelper getInstance(Context context){
       if(mHelper == null){
           mHelper = new UserDBHelper(context);
       }
       return mHelper;
   }
//    打开数据库的读连接
   public SQLiteDatabase openReadLink(){
       if(mRDB == null || !mRDB.isOpen()){
           mRDB = mHelper.getReadableDatabase();
       }
       return mRDB;
   }
//    打开写连接
   public SQLiteDatabase openWriteLink(){
       if(mWDB == null || !mWDB.isOpen()){
           mWDB = mHelper.getWritableDatabase();
       }
       return mWDB;
   }
//    关闭数据库连接
   public void closeLink(){
       if(mRDB != null && mRDB.isOpen()){
           mRDB.close();
           mRDB = null;
       }
       if(mWDB != null && mWDB.isOpen()){
           mWDB.close();
           mWDB = null;
       }
   }
//    创建数据库,执行建表语句
   @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="姓名"
           android:textSize="17sp"/>
       <EditText
           android:id="@+id/et_name"
           android:layout_width="0dp"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:hint="请输入姓名"
           android:inputType="text"
           android:textSize="17sp"/>
   </LinearLayout>
   <Button
       android:id="@+id/btn_add"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="添加"
       android:textSize="17sp"/>
</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();
//        打开数据库帮助器的实例
       mHelper = UserDBHelper.getInstance(this);
//        打开数据库帮助器的读写连接
       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:
//                以下声明一个用户信息对象,并填写它的各字段值
               user = new User(name);
               if(mHelper.insert(user)>0){
                   Toast.makeText(this,"添加成功",Toast.LENGTH_SHORT).show();
               }
               break;
       }
   }
}

来源:https://blog.csdn.net/Tir_zhang/article/details/127029669

标签:Android,SharePreferences,数据库,SQLite
0
投稿

猜你喜欢

  • springboot2.x整合tkmapper的示例代码

    2021-09-19 11:56:59
  • c#检测端口是否被占用的简单实例

    2022-08-10 01:45:49
  • 下载软件后使用c#获取文件的md5码示例

    2022-02-08 21:39:58
  • 新手入门Jvm--jvm概览

    2023-11-09 15:42:31
  • c# WPF中的TreeView使用详解

    2021-05-24 15:17:58
  • C++ 风靡一时的连连看游戏的实现流程详解

    2022-10-08 13:39:12
  • MybatisPlus分页排序查询字段带有下划线的坑及解决

    2022-08-16 22:26:28
  • c#制作类似qq安装程序一样的单文件程序安装包

    2021-07-22 17:13:31
  • python调用java的Webservice示例

    2021-07-31 13:36:09
  • 浅谈mybatis中SQL语句给boolean类型赋值问题

    2023-01-19 15:15:42
  • Java开发学习 Eclipse项目有红感叹号解决之道

    2022-10-22 15:29:27
  • SpringBoot分离打Jar包的两种配置方式

    2023-01-30 09:06:59
  • VS2015为console.readkey添加代码片段的方法

    2023-11-15 05:23:41
  • C# List介绍及具体用法

    2021-09-15 07:59:14
  • idea中同一SpringBoot项目多端口启动

    2023-05-09 06:39:27
  • Java中统计字符个数以及反序非相同字符的方法详解

    2022-10-21 10:48:02
  • C#实现Datatable排序的方法

    2022-12-30 11:31:52
  • Qt 使用QDialog实现界面遮罩的示例(蒙版)

    2022-10-31 07:58:37
  • Java Config下的Spring Test几种方式实例详解

    2022-12-17 00:31:36
  • android倒计时控件示例

    2022-12-01 05:34:53
  • asp之家 软件编程 m.aspxhome.com