android学习之-5种数据存储方式

来源:互联网 发布:金蝶软件下载中心 编辑:程序博客网 时间:2024/05/16 15:19
一、使用android系统自带的操作数据的流进行对数据的存储和访问,Context.openInputStream 和Context.openOutputStream的使用.
package com.enterise.always.test.activity;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import android.content.Context;import android.os.Environment;/** *  * @author Always * */public class FileService {private Context context;public FileService(Context context) {this.context = context;}// 文件的保存--在date/date目录xiapublic void fileSave(String name, String content) throws IOException {// TODO Auto-generated method stubFileOutputStream outStream = context.openFileOutput(name,Context.MODE_PRIVATE);outStream.write(content.getBytes());outStream.close();}// 文件的读取在date/date目录xiapublic String fileRead(String name) throws IOException {FileInputStream inStream = context.openFileInput(name);ByteArrayOutputStream outStream = new ByteArrayOutputStream();// 文件的对拷int len;byte[] by = new byte[1024];while ((len = inStream.read(by)) != -1) {outStream.write(by, 0, len);}String content = new String(outStream.toByteArray());outStream.close();inStream.close();return content;}// 文件的保存 在手机的sacard中public void fileSave2SDCard(String name, String content) throws IOException {// 判断手机卡是否是可以读取状态if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {File file = Environment.getExternalStorageDirectory();FileOutputStream outStream = new FileOutputStream(file);outStream.write(content.getBytes());outStream.close();}}}
二、使用SharedPreferenced对数据进行存储和访问。
package com.enterise.always.test.activity;import android.content.Context;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;public class FileService {private Context context;public FileService(Context context) {this.context = context;}// 存储数据public void fileSave2SharedPreferences(String name, String content) {SharedPreferences sp = context.getSharedPreferences(name,Context.MODE_PRIVATE);// 得到sharedPreferences对象,第一个参数是文件的名称,第二个是操作文件的类型,有私有化、添加、等模式。Editor editor = sp.edit();// 得到编辑器editor.putString("content", content);// 往编辑器中放要存放的内容editor.commit();// 编辑器提交}// 获取数据public void readFromShared(String name) {  SharedPreferences sp = context.getSharedPreferences(name, Context.MODE_PRIVATE);  String content = sp.getString( "content",""); //这个文件的存储形式类似于map集合有一个key和value //第一个是key,第二个参数是value,我们是根据前面的key去获取后面的value参数。 //用这个方式保存的数据时底层是使用xml的方式对这些数据进行存储的。 }}
三、将数据存储在网络程序中,或者从网络程序中获取数据
package com.enterise.always.test.activity;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.URL;import android.content.Context;public class FileService {private Context context;public FileService(Context context) {this.context = context;}/** * 文件保存到网络中 *  * @param http_url * @param content */public void save2Http(String http_url, String content) {try {URL url = new URL(http_url);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setDoInput(true);// 设置应许往里面写数据conn.setReadTimeout(1000 * 5);// 设置连接的时间conn.setRequestMethod("GET");if (conn.getResponseCode() == 200) {OutputStream outStream = conn.getOutputStream();outStream.write(content.getBytes());}conn.disconnect();} catch (Exception e) {e.printStackTrace();}}/** * 从网络中获取数据 * @param http_url * @return */public String readFromHttp(String http_url) {String content = null;try {URL url = new URL(http_url);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setDoOutput(true);// 设置应许往外写数据conn.setRequestMethod("GET");// 设置提交方式为get方式if (conn.getResponseCode() == 200) {InputStream inStream = conn.getInputStream();content = readData(inStream);}conn.disconnect();} catch (IOException e) {e.printStackTrace();}return content;}private String readData(InputStream inStream) throws IOException {ByteArrayOutputStream outStream = new ByteArrayOutputStream();byte[] by = new byte[1024];int len = 0;while ((len = inStream.read(by)) != -1) {outStream.write(by, 0, len);}String content = new String(outStream.toByteArray());return content;}}
四、使用SQLite数据库进行数据的存储和访问。
package com.enterise.always.test.activity;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class Sqlite extends SQLiteOpenHelper {// 构造函数用于初始化数据库的名称,版本号。public Sqlite(Context context, String name, CursorFactory factory,int version) {super(context, name, factory, version);// TODO Auto-generated constructor stub}// 第一次穿件数据库的时候会调用这个方法。用于创建表。以及表的结构。@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE person(personid integer primary key autoincrement ,name varchar(20)");}// 当数据库的版本发生变化的时候会调用这个方法,对表进行修改等操作。@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("ALTER TABLE person add phone varchar(12)");}}
package com.enterise.always.test.activity;import android.content.ContentValues;import android.content.Context;import android.database.sqlite.SQLiteDatabase;public class FileSqliteService {public Context context;private Sqlite sqlite;public FileSqliteService(Context context) {this.context = context;sqlite = new Sqlite(context, "sqlite.db", null, 1);}// 使用sql语句进行数据的增删改查。public void save(Person person) {SQLiteDatabase database = sqlite.getWritableDatabase();database.execSQL("insert into person values(?)",new Object[] { person.getName() });}// 2.使用contentvalues进行数据的存储,不用写sql语句。public void save2(Person person) {SQLiteDatabase database = sqlite.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", person.getName());database.insert("person", null, values);}}
五、使用ContentProvider进行数据的存储和访问,定义一个类继承ContentProvder在这里面可以用sqlite数据库进行操作数据
package com.enterise.always.test.activity;import android.content.ContentProvider;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;public class MyContentProvider extends ContentProvider {@Overridepublic boolean onCreate() {return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {return null;}@Overridepublic String getType(Uri uri) {return null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {return null;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {return 0;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {return 0;}}
在项目清单中<application android:icon="@drawable/icon" android:label="@string/app_name">        <provider android:name=".MyContentProvider" android:authorities="com.enterise.always.providers.personprovider"/>        </application>
Uri的数据就是:content://com.enterise.always.provider.personprovider    后面跟的是在项目清单中定义的主机名
使用ContentResolver对ContentProvider中的数据进行添加、删除、修改和查询操作:ContentResolver resolver =  getContentResolver();Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person");//添加一条记录ContentValues values = new ContentValues();values.put("name", "itcast");values.put("age", 25);resolver.insert(uri, values);  //获取person表中所有记录Cursor cursor = resolver.query(uri, null, null, null, "personid desc");while(cursor.moveToNext()){ Log.i("ContentTest", "personid="+ cursor.getInt(0)+ ",name="+ cursor.getString(1));}//把id为1的记录的name字段值更改新为limingContentValues updateValues = new ContentValues();updateValues.put("name", "liming");Uri updateIdUri = ContentUris.withAppendedId(uri, 2);resolver.update(updateIdUri, updateValues, null, null);//删除id为2的记录Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);resolver.delete(deleteIdUri, null, null);