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

一、使用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目录xia
	public void fileSave(String name, String content) throws IOException {
		// TODO Auto-generated method stub
		FileOutputStream outStream = context.openFileOutput(name,
				Context.MODE_PRIVATE);
		outStream.write(content.getBytes());
		outStream.close();
	}

	// 文件的读取在date/date目录xia
	public 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
	}

	// 第一次穿件数据库的时候会调用这个方法。用于创建表。以及表的结构。
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("CREATE TABLE person(personid integer primary key autoincrement ,name varchar(20)");
	}

	// 当数据库的版本发生变化的时候会调用这个方法,对表进行修改等操作。
	@Override
	public 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 {
	@Override
	public boolean onCreate() {

		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {

		return null;
	}

	@Override
	public String getType(Uri uri) {

		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {

		return null;
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {

		return 0;
	}

	@Override
	public 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字段值更改新为liming
ContentValues 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值