0%

数据存储

记录安卓的数据存储方式。

四种存储方式

默认保存路径,当前app文件夹内。

SharedPrefernces

  • 本质是基于xml文件存储键值对(key-value)数据,通常用来存储一些简单的配置信息(单一数据的持久化缓存)。
  • 生成的xml文件保存目录为:
    • /data/data/程序包名/shared_prefs
  • 可以存储的数据类型:boolean、float、int、long、String。
  • 应用卸载,xml文件会被删掉

文件存储

  • 常用于存储数量比较大的数据,缺点是更新数据比较困难。
  • 保存在app文件夹内,删除app后会一并被删掉。保存在SD卡内(其他路径),不会被一并删掉。

SQLite,轻量级的数据库。

ContentProvider,可实现应用程序之间数据共享的一种存储方式。

SharedPrefernces

使用:

代码演示

页面布局:

用户勾选“记住账号”,则使用SharedPrefernces将用户的账号、密码保存在设备上。下次打开app时自动填充账号密码。

设置全局变量:

1
2
3
4
5
private SharedPreferences sp;//读对象
private SharedPreferences.Editor editor;//写对象
//两个输入框 控件
private EditText acc;
private EditText pas;

在onCreate方法中,初始化全局变量:

1
2
3
4
5
6
7
8
9
 acc = (EditText)findViewById(R.id.account);
pas = (EditText)findViewById(R.id.passwd);
//实例化SharedPreferences
if (sp == null){
//name,xml文件名
sp = getSharedPreferences("Login_info",MODE_PRIVATE);//或 getContext().getSharedPreferences,或PreferenceManager.get...
//实例化Editor对象
editor = sp.edit();
}

使用sp对象读取数据,初始化输入框(如果有本地数据的话,自动填充账号密码):

1
2
3
4

//从SharedPreferences保存的xml文件中加载保存的账号信息
acc.setText(sp.getString("account",""));//后边的为默认值,当不存在该键值对时使用该值
pas.setText(sp.getString("passwd",""));

给按钮添加监听事件 (类实现接口 View.OnClickListener):

1
findViewById(R.id.login).setOnClickListener(this);

点击登录按钮后,处理逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Override
public void onClick(View view) {
if (view.getId() == R.id.login){//点击了登录按钮
String account = acc.getText().toString();//获取控件中输入的数据
String passwd = pas.getText().toString();
if ( account.equals("root") && passwd.equals("12345")){//判断密码是否正确
//密码正确
if (((CheckBox)findViewById(R.id.check)).isChecked()){
//勾选了,记住账号
editor.putString("account",account);//保存数据
editor.putString("passwd",passwd);
editor.commit();
}
//跳转页面
Intent intent = new Intent(Login.this, home.class);
startActivity(intent);
}else {
Toast.makeText(this,"密码不正确!!!",Toast.LENGTH_LONG).show();
}

}
}

使用editor保存数据到SharedPrefernces的xml文件中:(代码在onClick方法中)

1
2
3
editor.putString("account",account);//保存数据
editor.putString("passwd",passwd);
editor.commit();

文件保存目录为:/data/data/程序包名/shared_prefs

SQLite(重点)

考试要考。

步骤

代码演示

页面布局:

编写SQLiteOpenHelper子类,用于创建数据库或表。这里创建数据库student.db、数据表user,并插入两条数据。

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private DbOpenHelper helper = null;//自定义的SQLiteOpenHelper子类
private SQLiteDatabase db;//数据库 对象

private TextView db_name;//显示 数据库名
private TextView table_name;//显示 数据表名
private EditText tb_id;//显示 id列的数据
private EditText tb_name;//显示 name列的数据
private EditText tb_balance;//显示 balance列的数据
private TextView history;//显示 历史数据(全部数据)

private Button select;//查询 按钮
private Button insert;//查询 按钮


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

if (helper == null){
helper = new DbOpenHelper(this);//创建数据库和表
SQLiteDatabase readableDatabase = helper.getReadableDatabase();//获取数据库对象(可用于管理数据库)
}
tb_id = (EditText) findViewById(R.id.tb_id);
tb_name = (EditText) findViewById(R.id.tb_name);
tb_balance = (EditText) findViewById(R.id.tb_balance);
history = (TextView) findViewById(R.id.history);
findViewById(R.id.insert).setOnClickListener(this);//增
findViewById(R.id.select).setOnClickListener(this);//查
}

@Override
public void onClick(View view) {
String sql="";
switch (view.getId()){
case R.id.select:
db = helper.getReadableDatabase();//每次 用的时候获取一次SQLiteDatabase对象
sql = "select * from user";
Cursor cursor = db.rawQuery(sql,null);//游标(指向表中的某一行数据)
String str="";
while (cursor.moveToNext()){
str+="id:"+cursor.getInt(0);
str+=",name:"+cursor.getString(1);
str+=",balance:"+cursor.getDouble(2);
str+=" ";

tb_id.setText(String.valueOf(cursor.getInt(0)));
tb_name.setText(cursor.getString(1));
tb_balance.setText(String.valueOf(cursor.getDouble(2)));
}
cursor.close();//关闭游标
db.close();//释放数据库连接
history.setText(str);//显示数据
break;
case R.id.insert:
String name = tb_name.getText().toString();
String balance = tb_balance.getText().toString();
sql = "insert into user(name,balance)values('"+name+"','"+balance+"');";
System.out.println("sql语句:"+sql);
db = helper.getReadableDatabase();
db.execSQL(sql);
db.close();
Toast.makeText(this, "添加成功!", Toast.LENGTH_SHORT).show();
break;
}
}
}
若图片不能正常显示,请在浏览器中打开

欢迎关注我的其它发布渠道