Android数据存储——SharedPreferences、File、Sqlite

原创 2015年11月21日 19:49:38

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中常用的本地存储方式。
先告一段路。
具体的代码以下网址下载:

http://download.csdn.net/detail/yangzhaomuma/9289177

版权声明:本文为博主原创文章,未经博主允许不得转载。

android的五种存储方式SharedPreferences、文件存储、SQLite数据库、ContentProvider、网络存储

第一种: 使用SharedPreferences存储数据     适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序的各种配置信息(如是否打开音效、是否使用震动...
  • meijuanyou
  • meijuanyou
  • 2016年03月22日 19:15
  • 1836

SharedPreferences和SQLite

在Android存在中有两个和很重要的存储方式,一个是XML一个是数据库。 下面我就来介绍一下这样两个工具,SharedPreferences和SQLite 用着两个存储,我建议大家用工具类的方法...
  • weixin_36545772
  • weixin_36545772
  • 2017年07月03日 11:40
  • 217

在Android中使用SharedPreferences存储数据以实现数据共享

在Android中,我们可以使用SharedPreferences来保存数据,以实现数据的共享。 (以一个用户登录为例) 简介: 首先我们需要了解一下SharedPreferences类,Share...
  • Wetsion
  • Wetsion
  • 2016年06月11日 16:56
  • 782

Android学习笔记十二.Android数据存储与IO.SharedPreferences

SharedPreferences     对于应用程序的数据输入、输出,如果是应用程序只是少量数据需要保存,那么使用普通文件就可以了(SharedPrefereces);但如果应用程序有大量数据需要...
  • u012637501
  • u012637501
  • 2015年01月07日 21:35
  • 1119

手机应用中的“清除数据”操作对sqlite数据库和sharedPreferences的影响

经测试,默认地址下: 清除数据后,sqlite数据库会被删除。 清除数据后,sharedPreferences也会被删除...
  • u010413574
  • u010413574
  • 2017年03月16日 15:43
  • 440

Android数据存储 SharedPreferences实例

原理概念什么的我就不介绍了,网上很多,我就写一个具体的用法。 SharedPreferences 存储数据 存数据: //实例化一个SharedPreferences  第一个参数是存储key-val...
  • qq_38306233
  • qq_38306233
  • 2017年12月25日 17:25
  • 27

Android中的5种数据存储方式之——SharedPreferences

Android中的5种数据存储方式之——SharedPreferences简介 SharedPreferences是Android平台上一个轻量级数据存储方式,用来保存应用的一些常用配置,比如Acti...
  • zhan1350441670
  • zhan1350441670
  • 2015年07月27日 19:06
  • 1857

Android数据存储方案SharePreference和SQLite数据库

Android  系统一共提供了多种数据存储方式。分别是:SharePreference、SQLite、Content Provider和File,ContentProvider存储数据,网络存储数据...
  • husheng0
  • husheng0
  • 2015年04月27日 14:48
  • 1887

Android源码分析之SharedPreferences

在Android的日常开发中,相信大家都用过SharedPreferences来保存用户的某些settings值。Shared Preferences 以键值对的形式存储私有的原生类型数据,这里...
  • ljz2009y
  • ljz2009y
  • 2014年07月02日 17:35
  • 4428

android框架搭建——封装一个属于自己的数据存储工具类(sharedPreferences篇)

之前的几篇博文中提到过封装网络工具类,那么在发送请求并获取一个JSONObject对象之后,如何便捷的进行json解析和数据存储便成了我们要考虑的问题,在此分享一下自己在使用了诸多工具之后的一点心得。...
  • cai554112503
  • cai554112503
  • 2015年11月30日 22:24
  • 1056
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android数据存储——SharedPreferences、File、Sqlite
举报原因:
原因补充:

(最多只允许输入30个字)