安卓之数据存储学习总结

安卓的数据存储方式大概有六七种:

一、sdcard文件

向sdcard中写数据必须要添加权限android.permission.WRITE_EXTERNAL_STORAGE。

存放路径为mnt/sdcard/文件名。


写入:

private void writefile(String str, String path) {
		// TODO Auto-generated method stub
		File file;
		try {

			file = new File(path);
			file.createNewFile();
			FileOutputStream out = new FileOutputStream(file);
			String infoToWrite = str;
			out.write(infoToWrite.getBytes());
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
这是一个将指定的字符串写入指定路径的方法。path的值为
final public String ONPATH = "/mnt/sdcard/network_monitor.txt";

读:

	public String getinfo(String path) {
		File file;
		String str = "";
		FileInputStream in;
		try {
			file = new File(path);
			in = new FileInputStream(file);
			int length = (int) file.length();
			byte[] temp = new byte[length];
			in.read(temp, 0, length);
			str = EncodingUtils.getString(temp, TEXT_ENCODING);
			in.close();
		} catch (IOException e) {
			DisplayToast(e.toString());
		}
		return str;
	}


二、数据区文件的读写

数据区中的文件只能被自己的程序访问,存放路径为data/data/程序名/文件名


写入:

	public void writeFile(String htm) {// 写入html 网页。
		FileOutputStream fis = null;
		try {
			fis = openFileOutput("web.html", MODE_PRIVATE);
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		try {
			byte[] bytes = htm.getBytes();
			fis.write(bytes);
			fis.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

将一个html文件写入到数据区内。

读取:


FileInputStream in=openFileInput(Filename);
int length =in.available();
byte[] temp = new byte[length];
in.read(temp, 0, length);
str= EncodingUtils.getString(temp,"UTF-8");
in.close(); 



三、raw文件的读取

资源文件raw在res目录下,只能被读取不能被写入,路径为应用程序名/res/raw/文件名。

读取的代码和上面的数据区内文件读取差不多。

唯一的区别 就是

InputStream in=getResoureces().openRawResource(R.raw.filename);

四、asset文件的读取

资源文件assets在应用程序目录下,也是只能读取不能写入,存放路径为应用程序名/assets/文件名

读取的代码和上面的数据区内文件读取差不多。

唯一的区别 就是

InputStream in=getResoureces().getAssets().open(filename);

不知道为什么要设定这两个几乎一样的东西,查了一下原因:

assets下面的文件不会被编译,通过路径可以去访问其中的内容。raw中文件会自动编译,我们可以在R.java文件中找到对应的ID。

六、SharedPreferences存储

Context mContext = FileActivity.this;
		SharedPreferences pref = mContext.getSharedPreferences(
				"myActivityName", 0);
		// 取得相应的值,如果没有该值,说明还未写入,用true作为默认值
		isFirstIn = pref.getBoolean("isFirstIn", true);
		if (isFirstIn == true) {
			bulidDialog(FileActivity.this).show();
			Editor editor = pref.edit();
			editor.putBoolean("isFirstIn", false);
			editor.commit();
		}

这是一个读取和写入综合的。

判断用户是不是第一次打开这个软件。如果是就写入

本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。

七、sqlite 数据库存储

sqlite是安卓上的一个小型数据库,大概就237kb大小,但是功能还是挺全面,基本能满足日常开发的需要。

它的文件在data/data/应用程序名/databases目录下。

废话少说:

数据库的创建:

public class Sql extends SQLiteOpenHelper{
	public Sql(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
	}
	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
	
		db.execSQL("create table if not exists numbers(id integer primary key autoincrement,name varchar(20),number1 integer,number2 integer,number3 integer,number4 integer ,number5 integer)");
	}
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
	}
	}

如果是会mysql这样的数据库的话基本拿来就会用。

sqlite支持的数据类型有:

1.NULL:空值。
2.INTEGER:带符号的整型,具体取决有存入数字的范围大小。
3.REAL:浮点数字,存储为8-byte IEEE浮点数。
4.TEXT:字符串文本。
5.BLOB:二进制对象。
smallint 16 位元的整数。
interger 32 位元的整数。
decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float  32位元的实数。
double  64位元的实数。
char(n)  n 长度的字串,n不能超过 254。
varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000
date  包含了 年份、月份、日期。
time  包含了 小时、分钟、秒。
timestamp 包含了 年、月、日、时、分、秒、千分之一秒。
datetime 包含日期时间格式,必须写成'2010-08-05'不能写为'2010-8-5',否则在读取时会产生错误!


char、varchar、text和nchar、nvarchar、ntext的区别

1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

2、VARCHAR。存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

3、TEXT。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。

4、NCHAR、NVARCHAR、NTEXT。这三种从名字上看比前面三种多了个“N”。它表示存储的是Unicode数据类型的字符。我们知道字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。和char、varchar比较起来,nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。  

    所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar。


1、继承SQLiteOpenHelper之后就拥有了以下两个方法:

◆getReadableDatabase() 创建或者打开一个查询数据库

◆getWritableDatabase()创建或者打开一个可写数据库


上述代码创建一个数据库,然后建一个表,if no exists 是如果不存在的话就创建,表名是numbers,id integer,是有一个元素名是id,primary key的意思是主键,autoincrement的意思是自增。id一般是用来标明数据的一个数字,也可以直观的看出一共有多少条数据等等。后面就不多说了,都一样。

sqlite类必须有一个有四个参数的构造方法,上面也有了。

上面只有三个方法,也可以自己增加一些例如插入或者删除方法。

在activity中的引用方法

Sql myEventsData = new Sql(InputActivity.this, "mydb.db", null, 2);


最后一个参数version是版本信息,可以是1,2,3,以较大数为较新版本,如果创建数据库里版本数较高,则会覆盖原有数据库,我想这是更新的时候要用的?


用了很久context 这个东西也不知道 是什么,既然是总结那就查查吧:Context提供了关于应用环境全局信息的接口。它是一个抽象类,它的执行被Android系统所提供。它允许获取以应用为特征的资源和类型。同时启动应用级的操作,如启动Activity,broadcasting和接收intents。

插入方法:

当然之前要先获得对象,上面写了。

                    SQLiteDatabase db = myEventsData.getWritableDatabase();
						a[0] = Integer
								.parseInt(infor.substring(11 + i, 13 + i));
						a[1] = Integer
								.parseInt(infor.substring(14 + i, 16 + i));
						a[2] = Integer
								.parseInt(infor.substring(17 + i, 19 + i));
						a[3] = Integer
								.parseInt(infor.substring(20 + i, 22 + i));
						a[4] = Integer
								.parseInt(infor.substring(23 + i, 25 + i));
						for (int j = 0; j < 4; j++) {
							for (int k = 0; k < 4; k++) {
								if (a[k] > a[k + 1]) {
									temp = a[k];
									a[k] = a[k + 1];
									a[k + 1] = temp;
								}
							}
						}
						db.execSQL("insert into numbers values(null,"
								+ infor.substring(1 + i, 9 + i) + "," + a[0]
								+ "," + a[1] + "," + a[2] + "," + a[3] + ","
								+ a[4] + ")");
					}


第一个参数为null,因为我声明的第一个键值是id,为null的话,因为它是自增的,所以会自己生成。

删除方法:

SQLiteDatabase db = myEventsData.getWritableDatabase();
db.execSQL("delete from numbers where name="+ term.getText().toString());

这样我就删除了个name是从文本框获得的字符串的一条信息。

关键在于使用where找到你想要删除的那条信息。


此外where还支持想and和or这种多种条件的查询功能。


查询:

        SQLiteDatabase db = myEventsData.getReadableDatabase();
		Cursor cur = db.query("numbers", null, null, null, null, null, null);
		for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) {
			if (cur.getString(cur.getColumnIndex("name")).equals(start)) {
				myview.drawterm(start);
				for (int i = 0; i<200&&!cur.isAfterLast(); i++) {
					temp = Integer.parseInt(cur.getString(cur.getColumnIndex(number)));
					 x[i]=temp;
					 result+=x[i];
					 cur.moveToNext();
				}
				break;  
			}
		}
这里包括数据的查询和一个用查询执行冒泡排序的代码,也是从项目里copy出来的。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值