Android中数据存储的方式有5种,SharedPreferences、FIle、Sqlite、网络、contentprovider;
其中最常用的是SharedPreferences、Sqlite以及网络。
本篇主要介绍SharedPreferences、Sqlite、File;
1、SharedPreferences
这个功能是Android独有的。它存在的意义让ini格式的存储失去了意义。我们往常在其他语言java、c#中常用的ini,在android中十分少见,因为SharedPreferences十分方便。
SharedPreferences在Android中的使用有两种形式,可以用Activity和Context区别。
Activity形式:
PreferenceManager.getDefaultSharedPreferences(context);
Context形式:
context.getSharedPreferences(settingString, Context.MODE_PRIVATE);
这里直接上代码,直观的看如何使用它:
package com.example.imp;
import android.content.Context;
import android.content.SharedPreferences;
public class SharedPrefencesImp {
private Context context;
private String settingString="SharedPrefencesXml";
public SharedPrefencesImp(Context context)
{
this.context=context;
}
/**
* 设置sharedprefences
* @param keyname
* @param keyvalue
*/
public void SetSharedPrefences(String keyname,String keyvalue)
{
//SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(context).edit();写法也可以如此,默认名称为包名
SharedPreferences.Editor editor=context.getSharedPreferences(settingString, Context.MODE_PRIVATE).edit();
editor.putString(keyname, keyvalue);
editor.commit();
}
/**
* 获取sharedprefences中key为keyname的值
* @param keyname
* @return
*/
public String GetSharedPrefences(String keyname)
{
SharedPreferences sharedPreferences=context.getSharedPreferences(settingString, Context.MODE_PRIVATE);
String resultString= sharedPreferences.getString(keyname, "");
return resultString;
}
}
逻辑很简单,获取sharedprefences,如果要写入,用editor、put、commit;如果要读取,就直接传入自定义的key就可以;
在Activity中我们这么使用:
写入:
sharedPrefencesImp=new SharedPrefencesImp(SharedActivity.this);
sharedPrefencesImp.SetSharedPrefences("key", editText.getText().toString());
读取:
sharedPrefencesImp=new SharedPrefencesImp(SharedActivity.this);
editText.setText(sharedPrefencesImp.GetSharedPrefences("key"));
**在getSharedPreferences中,第二个参数需要注意:
Context.MODE_PRIVATE,表示只有本应用程序可用;
Context.MODE_MULTI_PROCESS,表示多进程都可使用;**
2、File
文件文本的存取,与java等类似,这里不再多说,用代码更直观:
package com.example.imp;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import android.content.Context;
public class FileImp {
Context context;
FileOutputStream fileOutputStream=null;
FileInputStream fileInputStream=null;
public FileImp(Context ct)
{
context=ct;
}
/**
* 文本写入
* @param filename
* @param valueString
* @throws Exception
*/
public void WriteFile(String filename,String valueString) throws Exception
{
fileOutputStream=context.openFileOutput(filename, Context.MODE_PRIVATE);
OutputStreamWriter outputStreamWriter=new OutputStreamWriter(fileOutputStream);
BufferedWriter bufferedWriter=new BufferedWriter(outputStreamWriter);
if(bufferedWriter!=null)
{
bufferedWriter.write(valueString);
bufferedWriter.close();
}
}
/**
* 文本读取
* @param filename
* @return
* @throws Exception
*/
public String readFile(String filename) throws Exception
{
String resultString="";
fileInputStream=context.openFileInput(filename);
InputStreamReader inputStreamReader=new InputStreamReader(fileInputStream);
BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
String lineString="";
while(((lineString=bufferedReader.readLine())!=null))
{
resultString+=lineString;
}
if(bufferedReader!=null)
{
bufferedReader.close();
}
return resultString;
}
}
3、Sqlite
Sqlite是一个多平台都可以使用的一种轻量级关系型数据库。Android比较有想法,直接集成了该数据库,还提供了一个抽象类给开发人员,更方便大家的使用。因此本地的存储如果数据量较大,这个数据库是十分应景的,免了我们重新装数据库、重新写方法类等步骤。
Android提供给我们的是一个抽象类,因此,我们需要继承并实现相关的函数才能使用。看下面的一个类,它继承SQLiteOpenHelper类。
package com.example.imp;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class SqliteImp extends SQLiteOpenHelper{
Context context;
String createString ="create table test " +
" (id integer primary key autoincrement, " +
"name text ," +
"age integer)";
String createString2="create table test1 " +
" (id integer primary key autoincrement, " +
"dept text ," +
"com text)";
SQLiteDatabase database=getWritableDatabase();
public SqliteImp(Context context, String name, CursorFactory factory,int version)
{
super(context, name, factory, version);
this.context=context;
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(createString);
db.execSQL(createString2);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
switch (oldVersion) {
case 1:
db.execSQL(createString2);
default:
break;
}
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
super.onDowngrade(db, oldVersion, newVersion);
}
public int insertData(String table,ContentValues contentValues)
{
int result=0;
result=(int)database.insertOrThrow(table, null, contentValues);
return result;
}
public int deleteData(String table,String whereClause,String[] whereArgs)
{
int result=0;
result=database.delete(table, whereClause, whereArgs);
return result;
}
public int updateData(String table,ContentValues values,String whereClause,String[] whereArgs)
{
int result=0;
result=database.update(table, values, whereClause, whereArgs);
return result;
}
public Cursor queryData(String table,String[] columns,String selection,String[] selectionArgs, String groupBy, String having, String orderBy)
{
Cursor cursor= database.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
return cursor;
}
public void excuteSql(String sql)
{
database.execSQL(sql);
}
}
这里有数据库的建立、升级、降级、增删改查;
在Activity中,如何使用呢?如下:
package com.example.sqlist_csdn;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.example.imp.SharedPrefencesImp;
import com.example.imp.SqliteImp;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class SqliteActivity extends Activity implements OnClickListener{
EditText editTextName,editTextAge;
Button add,delete,modify,query;
SqliteImp sqliteImp=null;
String databasename="data";
String tablename="test";
ListView listView;
SimpleAdapter simpleAdapter;
List<Map<String, Object>> mylist=new ArrayList<Map<String,Object>>();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.sqlite);
findView();
initView();
}
private void findView() {
editTextName=(EditText)findViewById(R.id.mytext);
editTextAge=(EditText)findViewById(R.id.myage);
add=(Button)findViewById(R.id.add);
delete=(Button)findViewById(R.id.delete);
modify=(Button)findViewById(R.id.modify);
query=(Button)findViewById(R.id.query);
listView=(ListView)findViewById(R.id.mylistview);
add.setOnClickListener(this);
delete.setOnClickListener(this);
modify.setOnClickListener(this);
query.setOnClickListener(this);
}
private void initView() {
sqliteImp=new SqliteImp(SqliteActivity.this,databasename , null,2);
Cursor cursor= sqliteImp.queryData(tablename, null, null, null, null, null, null);
if(cursor.moveToFirst()){
Map<String, Object> map=null;
while(cursor.moveToNext())
{
map=new HashMap<String, Object>();
map.put("name", cursor.getString(cursor.getColumnIndex("name")));
map.put("age", cursor.getString(cursor.getColumnIndex("age")));
mylist.add(map);
}
}
simpleAdapter=new SimpleAdapter(SqliteActivity.this, mylist, R.layout.item, new String[]{"name","age"}, new int[]{R.id.name,R.id.age});
listView.setAdapter(simpleAdapter);
simpleAdapter.notifyDataSetChanged();
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(sqliteImp==null)
sqliteImp=new SqliteImp(SqliteActivity.this,databasename , null, 1);
switch (v.getId()) {
case R.id.add:
if(TextUtils.isEmpty(editTextName.getText().toString())||TextUtils.isEmpty(editTextAge.getText().toString()))
{
Toast.makeText(SqliteActivity.this, "不能为空", 0).show();
return;
}
ContentValues contentValues=new ContentValues();
contentValues.put("name", editTextName.getText().toString());
contentValues.put("age",editTextAge.getText().toString());
int i= sqliteImp.insertData(tablename, contentValues);
if(i>0)
{
Toast.makeText(SqliteActivity.this, "数据插入成功", 0).show();
}
break;
case R.id.delete:
if(TextUtils.isEmpty(editTextName.getText().toString())||TextUtils.isEmpty(editTextAge.getText().toString()))
{
Toast.makeText(SqliteActivity.this, "不能为空", 0).show();
return;
}
int j=sqliteImp.deleteData(tablename, "name=? and age=?", new String[]{editTextName.getText().toString(),editTextAge.getText().toString()});
if(j>0)
{
Toast.makeText(SqliteActivity.this, "删除成功", 0).show();
}
break;
case R.id.modify:
if(TextUtils.isEmpty(editTextName.getText().toString())||TextUtils.isEmpty(editTextAge.getText().toString()))
{
Toast.makeText(SqliteActivity.this, "不能为空", 0).show();
return;
}
ContentValues values=new ContentValues();
values.put("name", editTextName.getText().toString());
values.put("age",editTextAge.getText().toString());
int k=sqliteImp.updateData(tablename, values, "id=? ",new String[]{"2"});
if(k>0)
{
Toast.makeText(SqliteActivity.this, "更新成功", 0).show();
}
break;
case R.id.query:
Cursor cursor= sqliteImp.queryData(tablename, null, null, null, null, null, null);
if(cursor.moveToFirst()){
Map<String, Object> map=null;
while(cursor.moveToNext())
{
map=new HashMap<String, Object>();
map.put("name", cursor.getString(cursor.getColumnIndex("name")));
map.put("age", cursor.getString(cursor.getColumnIndex("age")));
mylist.add(map);
}
}
simpleAdapter=new SimpleAdapter(SqliteActivity.this, mylist, R.layout.item, new String[]{"name","age"}, new int[]{R.id.name,R.id.age});
listView.setAdapter(simpleAdapter);
simpleAdapter.notifyDataSetChanged();
break;
default:
break;
}
}
}
以上是演示demo中的片段,演示了我们在android中常用的本地存储方式。
先告一段路。
具体的代码以下网址下载: