数据存储在开发中是使用最频繁的,在这里我介绍Android平台中实现数据存储的5种方式:
**
1:使用SharedPreferences存储数据;
2:File存储数据;
3:SQLite数据库储存数据;
4:使用ContentProvider储存数据;
5:网络储存数据;**
网络储存方式,需要与Android网络数据包打交道,关于Android 网络数据包的详细说明,请阅读Android SDK引用了Java SDK的哪些package。
ContentProvider简介:android四大组件之一,管理android以结构化方式存放的数据,以相对安全的方式封装数据(表)并提供简易的处理机制和统一的访问接口供其他程序调用.
但注意ContentProvider它也只是一个中间人,真正操作的数据源可能是数据库,也可以是文件、xml或网络等其他存储方式。
URL(统一资源标识符):代表要操作的数据,可以用来标识每个ContentProvider,这样你就可以通过指定的URI找到想要的ContentProvider,从中获取或修改数据。
在Android中URI的格式如下图所示:
A schema,已经由Android所规定为:content://.
B 主机名(Authority),是URI的授权部分,是唯一标识符,用来定位ContentProvider。
C部分和D部分:是每个ContentProvider内部的路径部分
C 指向一个对象集合,一般用表的名字,如果没有指定D部分,则返回全部记录。
D 指向特定的记录,这里表示操作user表id为7的记录。如果要操作user表中id为aname7/n法me即可。
主要方法
public boolean onCreate()
ContentProvider创建后 或 打开系统后其它应用第一次访问该CorovidntentPer时调用。
public Uri insert(Uri uri, ContentValues values) 外部应用向Contvider中添加数据.
public int delete(Uri uri, String selection, String[] selectionArgs) 外部应用从ContentProvider删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):
外部应用更新ContentProvider中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
供外部应用从ContentProvider中更取数据 .
数据库存储方法:
代码示例:
public class NoteActivity extends Activity implements View.OnClickListener,OnItemClickListener
,OnItemLongClickListener{
public static final String ACTION_NOTE_NEW = "action.note.new";
public static final String ACTION_NOTE_EDIT = "action.note.edit";
private ListView mListView;
private NoteAdapter mAdapter;
private ArrayList<Note> mNoteList;
private NoteDao mDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_note);
initDate();
initViews();
}
@Override
protected void onResume() {
super.onResume();
mNoteList = mDao.queryAll();
mAdapter = new NoteAdapter(mNoteList, this);
mListView.setAdapter(mAdapter);
}
private void initViews() {
mListView = (ListView)findViewById(R.id.listView);
mListView.setOnItemClickListener(this);
mListView.setOnItemLongClickListener(this);
findViewById(R.id.btn_add).setOnClickListener(this);
}
private void initDate() {
mDao = new NoteDao(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_add:
Intent intent = new Intent();
intent.setClass(this, NoteEditActivity.class);
intent.setAction(ACTION_NOTE_NEW);
startActivity(intent);
break;
default:
break;
}
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Note note = mNoteList.get(arg2);
Intent intent = new Intent();
intent.setClass(this, NoteEditActivity.class);
intent.setAction(ACTION_NOTE_EDIT);
intent.putExtra("id", arg3);
intent.putExtra("title", note.getTitle());
intent.putExtra("content", note.getContent());
startActivity(intent);
}
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
final long id = arg3;
new AlertDialog.Builder(this)
.setTitle("删除")
.setMessage("确定删除此记事?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
pbulic void } onClick(DialogInterface dialog, int which) {
mDao.delete(id);
} onResume ();
})
.setNegativeButton("取消", null)
.create().show
();
return true;
}
}
public class NoteAdapter extends BaseAdapter{
private ArrayList<Note> mNoteList;
private LayoutInflater mInflater;
public NoteAdapter(ArrayList<Note> list, Context context){
mNoteList = list;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
if (mNoteList != null) {
return mNoteList.size();
}
return 0;
}
@Override
public Object getItem(int position) {
if (mNoteList != null) {
return mNoteList.get(position);
}
return null;
}
@Override
public long getItemId(int position) {
if (mNoteList != null) {
Note note = mNoteList.get(position);
return note.getId();
}
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.activity_note_item, null);
}
TextView txtTitle = (TextView)convertView.findViewById(R.id.txt_title);
TextView txtContent = (TextView)convertView.findViewById(R.id.txt_content);
TextView txtTime = (TextView)convertView.findViewByime);
Note note = mNoteList.get(position);
String title = note.getTitle();
String content = note.getContent();
long time = note.getTime();
txtTitle.setText(title);
txtContent.setText(content);
txtTime.setText(String.valueOf(time));
return convertView;
}
}
public class NoteDao implements NoteTable {
private SQLiteDatabase mDB;
public NoteDao(Context context){
mDB = MyDBUtil.getInstance(context).getDB();
}
public long add(Note note){
//参数检查
if (note == null) {
return -1;
}
//参数转化
ContentValues values = new ContentValues();
values.put(TITLE, note.getTitle());
values.put(CONTENT, note.getContent());
values.put(TIME, note.getTime());
//入库
long id = mDB.insert(TABLE_NAME, null, values);
return id;
}
public ArrayList<Note> queryAll(){
ArrayList<Note> list = new ArrayList<Note>();
Cursor cursor = mDB.query(TABLE_NAME, null, null, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
do {
long id = cursor.getLong(0);
String title = cursor.getString(1);
String content = cursor.getString(2);
long time = cursor.getLong(3);
Note note = new Note();
note.setId(id);
note.setTitle(title);
note.setContent(content);
note.setTime(time);
list.add(note);
} while (cursor.moveToNext());
cursor.close();
}
return list;
}
public int update(long id, Note note){
//参数检查
if (id < 0 || note == null) {
return -1;
}
String where = ID + "=?";
String[] args = new String[]{String.valueOf(id)};
//参数转化
ContentValues values = new ContentValues();
values.put(TITLE, note.getTitle());
values.put(CONTENT, note.getContent());
values.put(TIME, note.getTime());
int count = mDB.update(TABLE_NAME, values, where, args);
return count;
}
public int delete(long id){
String where = ID + "=?";
String[] args = new String[]{String.valueOf(id)};
int count = mDB.delete(TABLE_NAME, where, args);
return count;
}
}
public interface NoteTable {
public static final String TABLE_NAME = "note";
public static final String ID = "_id";
public static final String TITLE = "title";
public static final String CONTENT = "content";
public static final String TIME = "time";
public static final String SQL_CREATE = new StringBuilder()
.append}
"CREATE TABLE IF NO
T EXISTS ").append(TABLE_NAME)
.append("(")
.append(ID).append(" INTEGER PRIMARY KEY,")
.append(TITLE).append(" TEXT,")
.append(CONTENT).append(" TEXT,")
.append(TIME).append(" INTEGER")
.append(");")
.toString();
} public class MyDBUtil {
public static final String DB_NAME = "A25";
public static final int DB_VER = 1;
private SQLiteDatabase mDB;
private MyHelper mHelper;
private static MyDBUtil mInstance;
private MyDBUtil(Context context){
mHelper = new MyHelper(context);
mDB = mHelper.getWritableDatabase();
}
public static MyDBUtil getInstance(Context context){
if (mInstance == null) {
mInstance = new MyDBUtil(context);
}
return mInstance;
}
public SQLiteDatabase getDB(){
return mDB;
}
@Override
protected void finalize() throws Throwable {
mHelper.close();
mDB.close();
super.finalize();
}
class MyHelper extends SQLiteOpenHelpe SharedPreferencest context) {
super(context, DB_NAME, null, DB_VER);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(NoteTable.SQL_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}
SharedPreferences的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息,用Sqlite数据库来存放并不划算,因为数据库连接跟操作等耗时大大影响了程序的效率。其存储位置在/data/data/<包名>/shared_prefs目录下。
另外SharedPreferences只能保存简单类型的数据,例如,String、int等。一般会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在 XML文件中,再用SharedPreferences保存。
使用SharedPreferences保存key-value对的步骤如下:
(1)使用Activity类的getSharedPreferences方法获得SharedPreferences对象,其中存储key-value的。
件的名称由getSharedPreferences方法的第一个参数指定,第二个参数指定访问应用程序私有文件的权限。
(2)使用SharedPreferences接口的edit获得SharedPreferences.Editor对象。
(3)通过SharedPreferences.Editor接口的putXxx方法保存key-value对。其中Xxx表示不同的数据类型。例如:字符串类型的value需要用putString方法。
(4)通过SharedPreferences.Editor接口的commit方法保存key-value对。commit方法相当于数据库事务中的提交(commit)操作。