安卓的数据存储方式大概有六七种:
一、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);
用了很久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出来的。