Android中常用的數據存儲一般有三種方式:SharedPreferences、文件和SQLite數據庫,用來保存需要長時間保存的數據。本文將通過幾個具體的小實例來講解這三種方式的具體實現。
數據存儲之SharedPreferences:
SharedPreferences位於android.content包中,用於存儲少量簡單數據。其特點有:
1. 輕型的數據存儲方式
2. 基於xml文件的存儲方式,以 鍵/值 對的形式存儲數據
3. 存儲簡單的配置信息,支持的存儲類型有:Boolean、Float、Integer、Long、String等。
SharedPreferences存儲數據流程:
1. 獲取SharedPreferences對象:
private SharedPreferences prefs;
① //不指定存儲文件名,使用默認的名稱,即活動的類名稱
prefs = getPreferences(MODE_PRIVATE);
② /*
*如果文件中的數據是Android應用程序中各個活動之間的共享數據,
*每個活動都能訪問,需要使用如下方式,獲取SharedPreferences:
* prefs = getSharedPreferences(“myPrefs”,MODE_PRIVATE);
*/
③ //也可以使用PreferenceManager
//PreferenceManager.setDefaultValues(this,R.xml.preferences,false);
//prefs = PreferenceManager.getDefaultPreferenceManagers(this);
2. 存儲數據(使用Editor對象,保存key-value值),讀取數據:
Editor editor = prefs.edit();
//存儲各種類型的數據
editor.putString(“name”,”Zhangsan”);
editor.putInt(“age”,18);
editor.putLong(“time”,System.currentTimeMillis);
//讀取數據
String name = prefs.getString(“name”);
int age = prefs.getInt(“age“);
3. 提交設置的數據,使數據保存到文件中:
在第2步中使用editor對象設置好key-value值後,數據並未保存到文件中,要保存還需提交
editor.commit();
4. 刪除保存的數據:
SharedPreferences.Clear();
說了這麼多,可能還是有些朋友說SharedPreferences到底是個什麼東東,下面個大家看看就明白了:
這下知道了吧,<string name=”user”>Zhangsan</string>就是用editor.putString(“user”,”Zhangsan”)設置的內容。使用DDMS可查看該文件位置,該文件存放在:
數據存儲之文件(File)存儲
使用SharedPreferences存儲文件比較方便簡單,但不能指定存儲文件的位置,存儲的內容也很少,使用文件存儲既可存儲到應用程序默認的放置文件的位置,也可存儲到外部存儲設備中,如外置SD卡中,可以減少占用手機內存,可以存儲比較大的文件。
文件的操作模式:
表1. 文件操作模式及說明
常量值
說明
MODE_PRIVATE
文件只能讓創建的應用程序訪問
MODE_WORLD_WRITEABLE
文件可讓其他應用程序寫入
MOED_WORLD_READABLE
文件可讓其他應用程序讀取
MODE_APPEND
文件若已存在,則在文件末尾寫入數據,不覆蓋原來文件內容
使用文件存儲的步驟:
1. 寫入文件
//以字符流的形式寫數據到文件
FileOutputStream out = openFileOutput(“out.txt”,MODE_PRIVATE);
String data = “123456abcdef”;
out.write(data); //寫數據到文件
out.close(); //關閉文件輸出流
/*
* 也可使用OutputStreamWriter以字節流的形式寫入文件
* OutputStreamWriter writer = new OutputStreamWriter(out);
* writer.write(data);
* writer.flush(); //輸出流數據
* writer.close(); //關閉流
*/
2. 讀取文件
FileInputStream fis = openFileInput("input.txt");
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len=fis.read(buffer))!=-1) {
out.write(buffer,o,len);
}
數據存儲之SQLite
Android使用SQLite數據庫引擎,它是包含的、事務型的數據庫引擎,無需單獨的服務線程。SQLite數據庫資源占用少、開源、功能強大,有以下特點:
1. 輕量級,使用一個動態庫,單個文件
2. 獨立性,沒有依賴,無需安裝
3. 隔離性,數據全在一個文件夾中
4. 跨平台,支持多種操作系統
5. 多語言接口,支持眾多編程語言
6. 安全性,支持事務處理。
7. 獨占性,使用共享鎖實現獨立事務處理,多個進程可同一時間從同意數據庫讀數據,但只有一個進程可寫數據。
SQLite支持的數據類型有:NULL、INTEGER、REAL、TEXT、BLOB類型。
SQLite存儲數據流程:
1. 獲取SQLiteDatabase數據庫對象
SQLiteDatabase db = openOrCreateDatabase(“user.db”,MODE_PRIVATE,null);
2. 執行增刪查改的數據操作語句
//創建一張表
db.execSQL(“create table if not exists contacts_tb(_id integer primary key autoincrement,name text not null,age integer not null)”);
//往數據庫裡插入一條數據
db.execSQL(“insert into contacts_tb(name,age)values(‘abc’,20)”);
db.execSQL(“insert into contacts_tb(name,age)values(‘cde’,18)”);
//查詢所有的數據,返回一個游標對象
Cursor cursor = db.raw(“select * from contacts_tb”,null);
/*
* 也可使用ContentValues執行SQL操作
* ContentValues values = new ContentValues();
* values.put(“name”,”aaa”);
* values.put(“age”,20);
* db.insert(“contacts_tb”,null,values); //插入數據
* values.clear();
* values.put(“age”,18);
* //更新_id>2的數據項的屬性值
* db.update(“contactes_tb”,values,”_id>?”,new String[]{“2”});
* //刪除名字中含有’a’的項
* db.delete(“contacts_tb”,”name like ?”,new String[]{“%a%”});
* //查詢_id>0的項,按名字排序
* Cursor cursor = db.query(“contacts_tb”,null,”_id>?”,new String[]{“0”},null,null,name);
*/
/*
* 使用SQLiteOpenHelper對象創建和管理數據庫
* 新建一個類DBOHelper extends SQLiteOpenHelper
* @override onCreate,onUpdate方法
* 使用DBOHelper對象
* DBOHelper helper = new DBOHelper(this,”user.db”);
* //創建或打開只讀數據庫
* SQLiteDatabase db = helper.getWriteableDatabase();
* //SQLiteDatabase db = helper.getReadableDatabase();
* 數據的操作和上邊都一樣
*/
3.處理獲取的結果
String name[10] ;
int age[10];
int i=0;
while(cursor.moveToNext()){
name[i] = cursor.getString(cursor.getColumnIndex(“name”));
age[i] = cursor.getInt(cursor.getColumnIndex(“age”));
i++;
}
cursor.close(); //需手動關閉,否則會出現未知的異常
db.close(); //數據庫對象也要手動關閉
下面來個具體的實例,簡單實現下SQLite的數據存儲,用到了ListView數據綁定:
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
DBHelper.java文件
public class DBHelper extends SQLiteOpenHelper{
public DBHelper(Context context, String name) {
super(context, name, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
Contact.java文件
public class Contact extends Activity{
private ListView lists;
SimpleAdapter adapter;
List<Map<String, Object>> dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_contacts);
lists = (ListView) findViewById(R.id.contacts_list);
All_Contacts();
}
public void All_Contacts(){
dataList = new ArrayList<Map<String,Object>>();
adapter = new SimpleAdapter(Contact.this, dataList, R.layout.layout_contacts, new String[]{"_id","name","sex","phone" }, new int[]{R.id._id,R.id._name,R.id._sex,R.id._phone});
DBHelper dbHelper = new DBHelper(Contact.this, "Contacts.db");
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from tb_persons", null);
cursor.moveToFirst();
do {
Map<String, Object> map = new HashMap<String, Object>();
map.put("_id", cursor.getInt(cursor.getColumnIndex("_id")));
map.put("name", cursor.getString(cursor.getColumnIndex("name")));
map.put("sex", cursor.getString(cursor.getColumnIndex("sex")));
map.put("phone", cursor.getString(cursor.getColumnIndex("phone")));
dataList.add(map);
}while(cursor.moveToNext());
cursor.close();
db.close();
lists.setAdapter(adapter);
}
}
MainActivity.java文件
public class MainActivity extends Activity {
private Button btn_Add;
private Button btn_OK;
private Button btn_Cancel;
private EditText nameText;
private EditText sexText;
private EditText phoneText;
private LinearLayout info_Layout;
private SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_Add = (Button) findViewById(R.id.btn_add);
btn_OK = (Button) findViewById(R.id.btn_OK);
btn_Cancel = (Button) findViewById(R.id.btn_Cancel);
nameText = (EditText) findViewById(R.id.name);
sexText = (EditText) findViewById(R.id.sex);
phoneText = (EditText) findViewById(R.id.phone);
info_Layout = (LinearLayout) findViewById(R.id.info_form);
DBHandler();
}
//輔助方法,打開添加聯系人信息區域
public void add_Contact(View v){
info_Layout.setVisibility(View.VISIBLE);
btn_Add.setEnabled(false);
}
//跳轉到查詢所有聯系人頁面
public void search_All(View v){
Intent intent = new Intent(MainActivity.this, Contact.class);
startActivity(intent);
}
//添加聯系人信息區域
public void insert_Info(View v){
long id =0 ;
String name = nameText.getText().toString().trim();
String sex = sexText.getText().toString().trim();
String phone = phoneText.getText().toString().trim();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("sex", sex);
values.put("phone", phone);
db = openOrCreateDatabase("Contacts.db", MODE_PRIVATE, null);
id = db.insert("tb_persons", null, values);
values.clear();
db.close();
nameText.setText("");
sexText.setText("");
phoneText.setText("");
info_Layout.setVisibility(View.INVISIBLE);
btn_Add.setEnabled(true);
if (id==-1) {
Toast.makeText(this, "聯系人添加失敗!", Toast.LENGTH_SHORT).show();
return ;
}
Toast.makeText(this, "聯系人添加成功!", Toast.LENGTH_SHORT).show();
}
//清空添加信息框
public void cancel_Info(View v){
nameText.setText("");
sexText.setText("");
phoneText.setText("");
info_Layout.setVisibility(View.INVISIBLE);
btn_Add.setEnabled(true);
Toast.makeText(this, "已取消添加!", Toast.LENGTH_SHORT).show();
}
//創建聯系人數據庫
private void DBHandler(){
//創建應用程序的數據庫
db = openOrCreateDatabase("Contacts.db", MODE_PRIVATE, null);
db.execSQL("create table if not exists tb_persons(_id integer primary key autoincrement,name text not null,sex text not null,phone text not null)");
}
}