Android数据存储

本文深入探讨了Android应用中的数据管理,包括私有文件夹文件的读写、从资源文件和Assets中读取文件,以及SQLite数据库的创建与数据操作。详细介绍了文件I/O操作和数据库增删改查的基本实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:文件操作

     1.1 私有文件夹文件的读取和写入

          在Android平台下,一个应用程序中所有的数据都是私有的,只是对自己可见的。当应用程序被安装到系统中后,其所在的包会有一个文件夹用于存放自己的数据,只有这个应用程序才有对这个文件夹的写入权限。

         在这个私有文件夹中读取文件的方式就是利用Java platform中的I/O操作,主要是字节流类,即:FileInputStream 和 FileOutputStream 这两个class。

         I/O两种方式:

             |--使用构造方法:FileOutputStream(File file,boolean append)

             |--调用Context.openFileInput和Context.openFileOutput 两个方法

       第一种方法没什么好说的,可以看我之前的关于文件操作的文章,这里主要讲一下第二种,Context对象中不仅提供了以上两种方法,还有其他方法:

           FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);      //返回一个FileOutputStream,如果不存在就自动创建

           FileInputStream fis = openFileInput(FILE_NAME);               // 返回一个FileInputStream对象

          String[] list =fileList()           //搜索私有文件夹下的文件,返回所有文件名组成的数组

          super.deleteFile(FILE_NAME);    //  删除文件,成功返回true,否则返回false

          其中使用openFileOutput方法时候,会涉及到指定打开模式,默认值为MODE_PRIVATE,值为零,还有几种模式:MODE_APPEND,即如果文件已存在,则不覆盖原有数据,继续写入。    还有MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE,这个主要用于赋予该文件读和写的权限

           示例,写入文件:

         private void writeFileData(String fileName2, String message2) {
		try {
			FileOutputStream fout = openFileOutput(fileName2, MODE_PRIVATE);// 获得FileOutputStream
			byte[] bytes = message2.getBytes(); // 将要写入的字符串转换为byte数组
			fout.write(bytes);
			fout.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

          值得注意的是,现在创建的文件在Android Project下的目录中是找不到的,因为这是私有的,只对自己可见,但是我们依然能在DDMS中找到它:

         

  读取文件:       

         private String readFileData(String fileName2) {
		String result = null;
		try {
			FileInputStream fin = openFileInput(fileName2);
			int length = fin.available(); // 获得文件长度
			byte[] buffer = new byte[length]; // 创建byte数组用于读入数据
			fin.read(buffer);
			result = EncodingUtils.getString(buffer, ENCODING);// 将byte数组转换为指定格式的字符串
			fin.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}


        1.2从Resources和Assets中读取文件

               在Android中,除了私有文件夹中有文件操作之外,还可以从资源文件和Assets中读取,这些文件由编程人员分别放在res/raw目录和assets目录下,用以存储应用程序中会用到的一些数据,不过,这些文件只能读取,不能进行写入的操作

          示例,资源文件读取:    

private String getFromResources(String string, int i) {
		String result = null;
		InputStream in = null;
		try {
			if (i == 0)
				in = getResources().openRawResource(R.raw.test1);//从raw中的文件获取输入流
			else
				in = getResources().getAssets().open(string);//从Assets中文件获取输入流
			int length = in.available(); // 获得文件长度
			byte[] buffer = new byte[length]; // 创建byte数组用于读入数据
			in.read(buffer);
			result = EncodingUtils.getString(buffer, ENCODING);// 将byte数组转换为指定格式的字符串
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

   

二.数据库SQLite

        2.1创建数据库对象

       Context.createDatabase(String name,int version ,int mode,CursorFactory factory)如果创建不成功则抛出FileNotFoundException异常,但是在实际开发中,为方便起见,通常是写一个数据库辅助类来创建或者打开数据库,这个class继承自SQLiteOpenHelper类:

    

package sugite.game;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class MySQLiteHelper extends SQLiteOpenHelper {

	public MySQLiteHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);// 调用父类的构造器
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("create table if not exists hero_info("
				+ "id integer primary key," + "name varchar,"
				+ "level integer)");// 调用execSQL方法创建表
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	}

}

       2.2,数据操作,即增删改查

       

private String queryData(MySQLiteHelper myHelper2) {
		String result="";
		SQLiteDatabase db = myHelper.getReadableDatabase();		//获得数据库对象
		Cursor cursor = db.query("hero_info", null, null, null, null, null, "id asc");	//查询表中数据
		int nameIndex = cursor.getColumnIndex("name");	//获取name列的索引
		int levelIndex = cursor.getColumnIndex("level");	//获取level列的索引
		for(cursor.moveToFirst();!(cursor.isAfterLast());cursor.moveToNext()){	//遍历查询结果集,将数据提取出来
			result = result + cursor.getString(nameIndex)+"    ";
			result = result + cursor.getInt(levelIndex)+"     \n";
		}
		cursor.close();		//关闭结果集
		db.close();			//关闭数据库对象
		return result;
	}

	private void insertAndUpdateData(MySQLiteHelper myHelper) {
		SQLiteDatabase db = myHelper.getWritableDatabase();		//获取数据库对象
		//使用execSQL方法向表中插入数据
		db.execSQL("insert into hero_info(name,level) values('Hero1',1)");
		//使用insert方法向表中插入数据
		ContentValues values  = new ContentValues();//创建ContentValues对象存储“列名-列值”映射
		values.put("name", "hero2");
		values.put("level", 2);
		db.insert("hero_info", "id", values);
		//使用update方法更新表中的数据
		values.clear();
		values.put("name", "hero3");
		values.put("level", 3);
		db.update("hero_info", values, "level = 2", null);//更新表中level为2的那行数据
		db.close();
	}


 



 

                 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值