您的位置:首页 > 移动开发 > Android开发

Android 数据存储方法

2016-12-27 13:18 344 查看
数据存储在开发中是使用最频繁的,在这里我介绍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)操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 数据存储