SharedPreferences和SQLite
在Android存在中有两个和很重要的存储方式,一个是XML一个是数据库。
下面我就来介绍一下这样两个工具,SharedPreferences和SQLite
用着两个存储,我建议大家用工具类的方法进行操作。这样能让代码更加简洁和更好操作
下面我写一个小例子:
用SharedPreferences进行XML存储,注册账号和密码并且记上相关信息
用SQLite存储studio表。对其进行增删改查
下面开始写了。先创建两个工具类。放在utility文件夹下
1
import android.content.Context;
2
import android.content.SharedPreferences;
3
4
/**
5
* Created by YacaToy on 2017/7/1.
6
*
7
* SharedPreferences工具
8
*
9
*/
10
public class SpUtil {
11
12
private static SharedPreferences sp;
13
14
/**
15
* @param context 上下文
16
* @param key 存储节点的名称
17
* @param value 存储节点的值 String类型
18
*/
19
public static void putString(Context context, String key , String value){
20
if(sp == null){
21
sp = context.getSharedPreferences("appmessage", Context.MODE_PRIVATE);
22
}
23
sp.edit().putString(key,value).commit();
24
}
25
26
/**
27
*
28
* @param context 上下文
29
* @param key 存储节点的名称
30
* @param defValue 默认值或者此节点读取到的结果
31
* @return
32
*/
33
public static String getString(Context context,String key ,String defValue){
34
if (sp == null){
35
sp = context.getSharedPreferences("appmessage", Context.MODE_PRIVATE);
36
}
37
return sp.getString(key, defValue);
38
}
39
40
41
}
通过这个工具类类,使用静态方法,更加方便数据的存储
再创建标签使用的类。
1
/**
2
* Created by YacaToy on 2017/7/1.
3
*/
4
5
public class ConstanValue {
6
7
/**
8
* 账号
9
*/
10
public static final String NUMBER = "number";
11
12
/**
13
* 密码
14
*/
15
public static final String PWQ = "pwq";
16
17
/**
18
* 姓名
19
*/
20
public static final String NMAE = "nmae";
21
22
/**
23
* 电话号码
24
*/
25
public static final String PHONE = "phone";
26
27
/**
28
* 性别
29
*/
30
public static final String SEX = "sex";
31
32
}
在这个界面中添加数据,存储到XML中
1
import android.app.Activity;
2
import android.os.Bundle;
3
import android.support.annotation.IdRes;
4
import android.support.annotation.Nullable;
5
import android.util.Log;
6
import android.view.View;
7
import android.widget.Button;
8
import android.widget.EditText;
9
import android.widget.RadioButton;
10
import android.widget.RadioGroup;
11
import android.widget.Toast;
12
13
import toy.yacatool.com.myappspandsql.R;
14
import toy.yacatool.com.myappspandsql.utility.ConstanValue;
15
import toy.yacatool.com.myappspandsql.utility.SpUtil;
16
17
/**
18
* Created by YacaToy on 2017/7/1.
19
*/
20
21
public class LoginActivity extends Activity {
22
private Button bt_confirm;
23
private RadioGroup rg_sex;
24
private EditText et_longin_number ,et_login_name ,et_longin_phone , et_login_pwq;
25
private static final String TAG = "LoginActivity";
26
27
protected void onCreate( Bundle savedInstanceState) {
28
super.onCreate(savedInstanceState);
29
setContentView(R.layout.activity_login);
30
initView();
31
32
}
33
34
/**
35
* View控件
36
*/
37
private void initView() {
38
et_longin_number = findViewById(R.id.et_login_number);
39
et_login_pwq = findViewById(R.id.et_login_pwq);
40
et_login_name = findViewById(R.id.et_login_name);
41
et_longin_phone = findViewById(R.id.et_longin_phone);
42
rg_sex = findViewById(R.id.rg_sex);
43
bt_confirm = findViewById(R.id.bt_confirm);
44
45
46
47
bt_confirm.setOnClickListener(new View.OnClickListener() {
48
49
public void onClick(View v) {
50
if(et_longin_number.getText().toString().trim() == null){
51
Toast.makeText(getApplicationContext(),"请输入账号",Toast.LENGTH_SHORT).show();
52
}else{
53
String number = et_longin_number.getText().toString().trim();
54
SpUtil.putString(getApplicationContext(), ConstanValue.NUMBER,number);
55
}
56
57
String pwq = et_login_pwq.getText().toString().trim();
58
if(pwq == null){
59
Toast.makeText(getApplicationContext(),"密码",Toast.LENGTH_SHORT).show();
60
}else{
61
SpUtil.putString(getApplicationContext(), ConstanValue.PWQ,pwq);
62
}
63
64
String name = et_login_name.getText().toString().trim();
65
if(name == null){
66
Toast.makeText(getApplicationContext(),"请输入名字",Toast.LENGTH_SHORT).show();
67
}else{
68
SpUtil.putString(getApplicationContext(),ConstanValue.NMAE,name);
69
}
70
71
String phone = et_longin_phone.getText().toString().trim();
72
if(phone == null){
73
Toast.makeText(getApplicationContext(),"请输入电话号码",Toast.LENGTH_SHORT).show();
74
}else{
75
SpUtil.putString(getApplicationContext(),ConstanValue.PHONE,phone);
76
}
77
78
RadioButton radioButton = findViewById(rg_sex.getCheckedRadioButtonId());
79
if(radioButton == null){
80
Log.w(TAG,"请选择性别");
81
}else{
82
String sex = radioButton.getText().toString();
83
SpUtil.putString(getApplicationContext(),ConstanValue.SEX,sex);
84
Log.w(TAG,sex);
85
}
86
finish();
87
88
}
89
90
});
91
92
}
93
94
95
}
大家可以看到这样的话,就能更加简单的把数据存储到文件中去,读和取都是以样的
1
SpUtil.putString(getApplicationContext(),ConstanValue.SEX,sex);
下面是登录
1
import android.content.Intent;
2
import android.support.v7.app.AppCompatActivity;
3
import android.os.Bundle;
4
import android.view.View;
5
import android.widget.Button;
6
import android.widget.EditText;
7
import android.widget.Toast;
8
9
import toy.yacatool.com.myappspandsql.R;
10
import toy.yacatool.com.myappspandsql.utility.ConstanValue;
11
import toy.yacatool.com.myappspandsql.utility.SpUtil;
12
13
public class MainActivity extends AppCompatActivity {
14
private EditText et_number,et_pwq;
15
16
protected void onCreate(Bundle savedInstanceState) {
17
super.onCreate(savedInstanceState);
18
setContentView(R.layout.activity_main);
19
initView();
20
}
21
/**
22
* View控件
23
*/
24
private void initView() {
25
et_number = (EditText) findViewById(R.id.et_number);
26
et_pwq = (EditText) findViewById(R.id.et_pwq);
27
Button bu_login = (Button) findViewById(R.id.bt_login);
28
Button bt_log = (Button) findViewById(R.id.bt_log);
29
bu_login.setOnClickListener(new myClink());
30
bt_log.setOnClickListener(new myClink());
31
}
32
33
class myClink implements View.OnClickListener{
34
35
36
public void onClick(View v) {
37
switch (v.getId()){
38
//注册
39
case R.id.bt_login:
40
startActivity(new Intent(MainActivity.this,LoginActivity.class));
41
42
break;
43
//登录
44
case R.id.bt_log:
45
String number = SpUtil.getString(getApplicationContext(), ConstanValue.NUMBER,"没有");
46
47
if(et_number.getText().toString().trim().equals(number)){
48
String pwq = SpUtil.getString(getApplicationContext(), ConstanValue.PWQ,"没有");
49
if (et_pwq.getText().toString().trim().equals(pwq)){
50
startActivity(new Intent(MainActivity.this,ExamineActivity.class));
51
52
}else{
53
Toast.makeText(getApplicationContext(),"请输入正确密码",Toast.LENGTH_SHORT).show();
54
}
55
}else{
56
Toast.makeText(getApplicationContext(),"没有该账号",Toast.LENGTH_SHORT).show();
57
}
58
59
60
break;
61
}
62
}
63
}
64
65
}
66
读取数据就变得简单。适合所有String类型的存储。如果需要其他类型的存储之需要修改类型即可
1
SpUtil.getString(getApplicationContext(), ConstanValue.PWQ,"没有");
大家可以试着写出。所有数据的界面。用SpUtil读取出来
然后下面介绍SQLite
要玩成就是这么一个界面
操作数据库首先要有一个数据库。
1
import android.content.Context;
2
import android.database.sqlite.SQLiteDatabase;
3
import android.database.sqlite.SQLiteOpenHelper;
4
5
/**
6
* Created by YacaToy on 2017/7/2.
7
*/
8
9
public class StudioOpenHelper extends SQLiteOpenHelper {
10
private final String SQL = "create table studio (_id integer primary key autoincrement" +
11
" , name varchar(50),phone varchar(20));";
12
13
public StudioOpenHelper(Context context) {
14
super(context, "studio.db", null, 1);
15
}
16
17
18
public void onCreate(SQLiteDatabase db) {
19
db.execSQL(SQL);
20
}
21
22
23
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
24
25
}
26
}
27
创建一个数据库
然后再创建一个数据库操作的单例模式
1
import android.content.ContentValues;
2
import android.content.Context;
3
import android.database.Cursor;
4
import android.database.sqlite.SQLiteDatabase;
5
6
import java.util.ArrayList;
7
import java.util.List;
8
9
import toy.yacatool.com.myappspandsql.db.StudioOpenHelper;
10
import toy.yacatool.com.myappspandsql.db.domain.StudioInfo;
11
12
/**
13
* Created by YacaToy on 2017/7/2.
14
* Studio的单例模式
15
*/
16
17
public class StudioDao {
18
private StudioOpenHelper studioOpenHelper;
19
private Context context;
20
21
//Studio的单例模式
22
//1,私有化构造方法
23
private StudioDao(Context context){
24
this.context = context;
25
studioOpenHelper = new StudioOpenHelper(context);
26
}
27
28
//2,声明一个当前类
29
private static StudioDao studioDao = null;
30
31
//3,提供一个静态方法,如果当前类的对象为空,创建一个新的类
32
public static StudioDao getInstance(Context context){
33
if (studioDao == null){
34
studioDao = new StudioDao(context);
35
return studioDao;
36
}
37
return studioDao;
38
}
39
40
//增
41
public void add(String name ,String phone){
42
SQLiteDatabase db = studioOpenHelper.getWritableDatabase();
43
ContentValues values = new ContentValues();
44
values.put("name",name);
45
values.put("phone",phone);
46
db.insert("studio",null,values);
47
db.close();
48
}
49
50
//删
51
public void delest(String name){
52
SQLiteDatabase db = studioOpenHelper.getWritableDatabase();
53
db.delete("studio","name = ?" ,new String[]{name});
54
db.close();
55
}
56
57
//改
58
public void change(String name ,String phone){
59
SQLiteDatabase db = studioOpenHelper.getWritableDatabase();
60
ContentValues values = new ContentValues();
61
values.put("phone",phone);
62
db.update("studio",values,"name = ?",new String[]{name});
63
db.close();
64
}
65
66
//查
67
68
public List<StudioInfo> examineAll(){
69
SQLiteDatabase db = studioOpenHelper.getWritableDatabase();
70
//参数1:表名
71
//参数2:要想显示的列
72
//参数3:where子句
73
//参数4:where子句对应的条件值
74
//参数5:分组方式
75
//参数6:having条件
76
//参数7:排序方式
77
Cursor cursor = db.query("studio",new String[]{"name","phone"},null,null,null,null,null);
78
List<StudioInfo> list = new ArrayList<StudioInfo>();
79
while (cursor.moveToNext()){
80
StudioInfo studioInfo = new StudioInfo();
81
String name = cursor.getString(0);
82
studioInfo.setName(name);
83
String phone = cursor.getString(1);
84
studioInfo.setPhone(phone);
85
list.add(studioInfo);
86
}
87
cursor.close();
88
db.close();
89
return list;
90
}
91
92
}
这里的查询就是查询所有的数据
1
import android.app.Activity;
2
import android.os.Bundle;
3
import android.os.Handler;
4
import android.os.Message;
5
import android.support.annotation.Nullable;
6
import android.util.Log;
7
import android.view.View;
8
import android.view.ViewGroup;
9
import android.widget.BaseAdapter;
10
import android.widget.Button;
11
import android.widget.EditText;
12
import android.widget.ListView;
13
import android.widget.TextView;
14
15
import java.util.List;
16
17
import toy.yacatool.com.myappspandsql.R;
18
import toy.yacatool.com.myappspandsql.db.dao.StudioDao;
19
import toy.yacatool.com.myappspandsql.db.domain.StudioInfo;
20
21
22
/**
23
* Created by YacaToy on 2017/7/2.
24
*/
25
26
public class StudioActivity extends Activity {
27
28
private String name ,phone;
29
30
private final String TAG = "StudioActivity";
31
private EditText et_studio_name ,et_studio_phone;
32
private Button bt_add ,bt_refer ,bt_cancel , bt_change;
33
private MyAdaper myAdaper;
34
private StudioDao dao ;
35
private List<StudioInfo> studioInfos;
36
private ListView lv_studio;
37
private Handler mHandler = new Handler(){
38
39
public void handleMessage(Message msg) {
40
myAdaper = new MyAdaper();
41
lv_studio.setAdapter(myAdaper);
42
}
43
};
44
45
46
protected void onCreate( Bundle savedInstanceState) {
47
super.onCreate(savedInstanceState);
48
setContentView(R.layout.activity_studio);
49
initData();
50
initView();
51
52
}
53
54
/**
55
* 数据
56
*/
57
private void initData() {
58
new Thread(){
59
60
public void run() {
61
dao = StudioDao.getInstance(getApplicationContext());
62
studioInfos = dao.examineAll();
63
Message msg = Message.obtain();
64
msg.what = 0;
65
mHandler.sendMessage(msg);
66
}
67
}.start();
68
69
70
}
71
72
/**
73
* 控件
74
*/
75
private void initView() {
76
lv_studio = findViewById(R.id.lv_studio);
77
et_studio_name = findViewById(R.id.et_studio_name);
78
et_studio_phone = findViewById(R.id.et_studio_phone);
79
bt_add = findViewById(R.id.bt_add);
80
81
bt_cancel = findViewById(R.id.bt_cancel);
82
bt_cancel.setOnClickListener(new MyOnClick());
83
bt_change = findViewById(R.id.bt_change);
84
bt_change.setOnClickListener(new MyOnClick());
85
bt_refer = findViewById(R.id.bt_refer);
86
bt_refer.setOnClickListener(new MyOnClick());
87
bt_add.setOnClickListener(new MyOnClick());
88
lv_studio = findViewById(R.id.lv_studio);
89
90
}
91
92
class MyAdaper extends BaseAdapter{
93
94
95
public int getCount() {
96
return studioInfos.size();
97
}
98
99
100
public StudioInfo getItem(int position) {
101
return studioInfos.get(position);
102
}
103
104
105
public long getItemId(int position) {
106
return position;
107
}
108
109
110
public View getView(int position, View convertView, ViewGroup parent) {
111
View view = null;
112
if(view == null){
113
view = View.inflate(getApplicationContext(),R.layout.list_studio,null);
114
}else{
115
view = convertView;
116
}
117
TextView tv_list_name = view.findViewById(R.id.tv_list_name);
118
TextView tv_list_phone = view.findViewById(R.id.tv_list_phone);
119
String name = getItem(position).getName();
120
tv_list_name.setText(name);
121
String phone = getItem(position).getPhone();
122
tv_list_phone.setText(phone);
123
return view;
124
}
125
}
126
127
class MyOnClick implements View.OnClickListener {
128
129
130
public void onClick(View v) {
131
switch (v.getId()){
132
case R.id.bt_add :
133
dao = StudioDao.getInstance(getApplicationContext());
134
name = et_studio_name.getText().toString().trim();
135
phone = et_studio_phone.getText().toString().trim();
136
dao.add(name,phone);
137
StudioInfo studioinfo = new StudioInfo();
138
studioinfo.setPhone(phone);
139
studioinfo.setName(name);
140
studioInfos.add(studioinfo);
141
myAdaper.notifyDataSetChanged();
142
break;
143
case R.id.bt_refer :
144
dao = StudioDao.getInstance(getApplicationContext());
145
studioInfos = dao.examineAll();
146
int size = studioInfos.size();
147
Log.w(TAG, size+"");
148
break;
149
150
case R.id.bt_cancel:
151
dao = StudioDao.getInstance(getApplicationContext());
152
name = et_studio_name.getText().toString().trim();
153
dao.delest(name);
154
studioInfos = dao.examineAll();
155
myAdaper.notifyDataSetChanged();
156
break;
157
158
case R.id.bt_change:
159
name = et_studio_name.getText().toString().trim();
160
phone = et_studio_phone.getText().toString().trim();
161
dao = StudioDao.getInstance(getApplicationContext());
162
dao.change(name , phone);
163
studioInfos = dao.examineAll();
164
myAdaper.notifyDataSetChanged();
165
166
167
break;
168
169
170
}
171
}
172
}
173
}
174
这样子。和SpUtil一样。能让代码简洁,不比重复
如果有重复或者类似的数据操作,可以写上工具类或者单例模式这样更加方便