Android数据存取
一、 文件内容存取,不可追加
文件存放在/data/data/<package name>/files目录下
1、 向文件中写内容:
getFileDir()获得应用程序的文件路径,创建文件输出流
FileOutputStreamout = new FileOutputStream(getFileDir()+“/”+FILE_NAME);
创建字节打印流
PrintStream ps =new PrintStream(out);
将内容转化为字节形式,写入文件
Ps.write(content.getBytes());
2、 向程序中写内容,输出到控制台
getFileDir()获得应用程序的文件路径创建文件输入流
FileInputStream in = new FileInputStream(getFileDir()+“/”+FILE_NAME);
创建一个字节数组
Byte[] bt = new Byte[];
创建一个可变长度的字符串数组
StringBuildetr sb = new StringBuilder();
定义读取长度
Int len=-1
利用循环读取内容
While((len = in.read(bt)) != -1)
{
//向字符串数组中不断添加数据
Sb.append();
}
//写入按钮的监听
public void write(View view)
{
//获取客户端输入
String content = mEt_writeData.getText().toString();
try {
/**
* 创建
* getFileDir:获取应用程序数据文件的路径
* "/":表示在某个路径名下级目录
*/
FileOutputStream out = new FileOutputStream(getFilesDir()+"/"+FILE_NAME);
PrintStream ps = new PrintStream(out);
ps.write(content.getBytes());
ps.close();
out.close();
ToastUtil.showToast(this,"写入成功");
} catch (Exception e) {
e.printStackTrace();
ToastUtil.showToast(this,"写入失败");
}
}
//读取按钮的监听
public void read(View view)
{
try {
//创建文件你入流
FileInputStream fis = new FileInputStream(getFilesDir()+"/"+FILE_NAME);
//创建BYTE数组
byte[] by = new byte[1024];
//定义读取长度
int len = -1;
//定义可变长字符串,作用:存放字符串
StringBuilder sb = new StringBuilder();
//循环读取
while ((len = fis.read(by))!=-1)
{
sb.append(new String(by,0,len));
}
ToastUtil.showToast(this,"读取成功");
//拿到读到的字符串
String content = sb.toString();
//显示在界面上
mEt_readData.setText(content);
} catch (Exception e) {
e.printStackTrace();
ToastUtil.showToast(this,"读取失败");
}
}二、 文件内容存取,可追加
文件存放在/data/data/<package name>/files目录下
1、向文件中写入内容,可追加
OpenFileOutput(FILE_NAME,MODE_APPEND),函数用于向文件中输入内容,有两个参数,第一个参数是文件名,不需要包含文件路径。如果文件名不存在,会自动创建。
第二个参数是文件写入模式,一共有四种;
1、 MODE_PRIVATE该文件只允许该应用程序读取,会覆盖原来内容
2、 MODE_APPEND:该文件采取追加的模式
3、 MODE_WORLD_READABLE:允许其他应用程序读该文件
4、 MODE_WORLD_WRITEABLE:允许其他应用程序读取该文件
创建文件输出流
FileOutputStreamout = new this.openFileOutput(FILE_NAME,MODE_APPEND);
读取界面输入的内容
Out.write(content.getBytes());
3、 将文件中的内容输入到程序
FileInputStream in = openFileInput(FILE_NAME);
对输入流进行包装,可以每次读取一行
BufferedReader br = new BufferedReader(newInputStreamReader(in));
String lien = null;
StringBuffer sb = new StringBuffer();
While( (line = br.readLine() ) != null )
{
Sb.append(line);
}
//写入按钮的监听
public void write(View view)
{
String content = mEt_writeData.getText().toString();
try {
/**
* 创建文件输出流
* FILE_NAME:文件名
* MODE_APPEND:文件写入模式
* 1、MODE_PRIVATE该文件只允许该应用程序读取
* 2、MODE_APPEND:该文件采取追加的模式
* 3、MODE_WORLD_READABLE:允许其他应用程序读该文件
* 4、MODE_WORLD_WRITEABLE:允许其他应用程序读取该文件
* Android4.2之后,不推荐3.4两种方式
*/
FileOutputStream fos = this.openFileOutput(FILE_NAME,MODE_APPEND);
fos.write(content.getBytes());
fos.flush();
fos.close();
ToastUtil.showToast(this,"写入成功");
} catch (Exception e) {
e.printStackTrace();
ToastUtil.showToast(this,"写入失败");
}
}
//读取按钮的监听
public void read(View view)
{
FileInputStream fis = null;
try {
fis = openFileInput(FILE_NAME);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = br.readLine()) !=null)
{
sb.append(line);
}
mEt_readData.setText(sb.toString());
ToastUtil.showToast(this,"读取成功");
} catch (Exception e) {
e.printStackTrace();
ToastUtil.showToast(this,"读取失败");
}
}三、 在SD卡上的文件存取
文件存放早SD卡上
1、将数据输出到SD卡的文件中
判断当前手机是否有SD卡,并判断应用程序是否有读写SD卡的权限
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
获取SD卡的目录
FilesdDir = Environment.getExternalStorageDirectory();
获取读写的文件
FiletargetFile = new File(sdDir.getAbsolutePath()+FILE_NAME);
创建文件流对象,,第一个参数是文件,第二个参数是操作权限
RandomAccessFileraf = new RandomAccessFile(targetFile,”rw”);
记录位置,
Raf.seek(targetFile.length());
写数据到文件
Raf.write(content.getBytes());
2、将数据从文件中写入到程序中
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
获取SD卡的目录
FilesdDir = Environment.getExternalStorageDirectory();
//获得文件路径
StringtargetFile = sdDir.getExternalStorageDirectory();
创建文件流对象
FileInputStreamin = new FileInputStream(targetFile);
将字节流转化为字符流
BufferedReaderbr = new BufferedReader(new InputStreamReader(in));
String line=null;
StringBuffer sb= new StringBuffer();
While ((line = in.readLine()!=null)
{
Sb.append(line)
}
//写入按钮的监听
public void write(View view)
{
String content = mEt_writeData.getText().toString();
//判断当前手机是否有SDK,并且判断应用程序是否有读取SDK的权限
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//获取SDK目录
File sdDir = Environment.getExternalStorageDirectory();
//获取写入的文件
File targetFile = new File(sdDir.getAbsolutePath()+FILE_NAME);
//String targetFile = sdDir.getAbsolutePath()+FILE_NAME;
try {
//输出内容到SDK目录下指定的文件中
//FileOutputStream fos = new FileOutputStream(sdDir+FILE_NAME);
RandomAccessFile raf = new RandomAccessFile(targetFile,"rw");
//查找目标文件长度,方便下次读写
raf.seek(targetFile.length());
//开始向文件中输入内容
raf.write(content.getBytes());
//关闭流
raf.close();
ToastUtil.showToast(this,"写入成功");
} catch (Exception e) {
e.printStackTrace();
ToastUtil.showToast(this,"写入失败");
}
}else{
ToastUtil.showToast(this,"内存卡不存在");
}
}
//读取按钮的监听
public void read(View view)
{
//FileInputStream fis = null;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
File sdDir = Environment.getExternalStorageDirectory();
String targetFile = sdDir.getAbsolutePath()+FILE_NAME;
try {
FileInputStream fis = new FileInputStream(targetFile);
//将字节流转换为字符流
BufferedReader buff = new BufferedReader(new InputStreamReader(fis));
String line = null;
//可变长字符串
StringBuffer sb = new StringBuffer();
while ((line = buff.readLine()) != null)
{
sb.append(line);
}
buff.close();
mEt_readData.setText(sb.toString());
ToastUtil.showToast(this,"读取成功");
} catch (Exception e) {
e.printStackTrace();
ToastUtil.showToast(this,"读取失败");
}
}else{
ToastUtil.showToast(this,"内存卡不存在");
}
}
四、 Android配置参数存取SharedPreferences
SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下
1、 将数据从程序中输出到文件中
实例化SharedPrefefences对象
两个参数:第一个:文件名,第二个:文件创建模式
SharedPreferences sp =getSharedPreferences(“userinfo”,Context.MODE_APPEND);
实例化编辑器对象
SharedPreferences.Editor editor = sp.edit();
写数据
Editor.putString(“content”,”name”);
提交数据
Editor.commit();
2、 从文件中将数据写入程序中
两个参数:第一个Key值,第二个参数:如果取不到Key值对应的value值,显示的默认值
String content = sp.getString(“content”,””);
//写入按钮的监听
public void write(View view)
{
String content = mEt_writeData.getText().toString();
//创建一个可以写入数据的对象
SharedPreferences.Editor editor = sp.edit();
//写入数据
editor.putString("content",content);
editor.putString("username","briup");
editor.putBoolean("isLogin",false);
//提交数据,提交到程序内存的同时提交到磁盘上,先提交到内存再提交到磁盘上
editor.commit();
}
//读取按钮的监听
public void read(View view)
{
/**
* 第一个参数:是Key值
* 第二个参数:如果取不到Key值对应得Value值,显示默认的Value值
*/
String content = sp.getString("content","");
String contents = sp.getString("contents","========");
boolean isLogin = sp.getBoolean("isLogin",false);
mEt_readData.setText(content+" "+contents+" "+isLogin);
}
五、 Android数据库操作之sql语句操作
1、 声明一个数据库对象
SQLiteDatabase db;
2、 实例化数据库对象,第一个参数:文件路径名,绝对路径,第二个参数:工厂类对象,值一般为空
Db =SQLiteDatabase.openOrCreateDatabase(getFilesDir()+”/my.db”,null);
3、 SQL操作语句
建表语句
Db.execSQL(“create table tbl_user(_id integer primary keyautoincrement,name text,passwd varchar(10))”);
插入数据
Db.execSQL(“insert into tbl_user(name,passwd)values(?,?)”,new String[]{“张三”,”123”});
查询数据
Db.execSQL(“select * from tbl_user where _id=?”,newString[] {“22”});
修改语句
Db.execSQL(“update tbl_user set name=’lisi’ where_id=?”,new String[]{“22”});
删除语句
Db.execSQL(“delect from tbl_user where _id=?”,new String[]{“22”});
public class FourthActivity extends AppCompatActivity {
private SQLiteDatabase db;//申明一个数据库对象
private final String FILE_NAME = "briup2.txt";
private EditText mEt_writeData,mEt_readData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEt_readData = (EditText) findViewById(R.id.main_et_readdata);
mEt_writeData = (EditText) findViewById(R.id.main_et_writedata);
/**
* 第一个参数:文件路径名,绝对路径
* 第二个参数:Cursor工厂类对象,与ResultSet类似,
* 值一般为空,表示采用系统默认的工厂类
*/
db = SQLiteDatabase.openOrCreateDatabase(getFilesDir()+"/my.db",null);
ToastUtil.showToast(this,"数据库创建成功");
/**
* Sqlite数据类型;null integer real(浮点型) text(文本类型)
*/
String sql = "create table tbl_user(_id integer primary key autoincrement,name text,passwd varchar(10))";
//可以执行任何SQL语句,不返回结果集
// //执行没有占位符的SQL语句
ToastUtil.showToast(this,"表创建成功");
// db.execSQL("insert into tbl_user(name,passwd) values(?,?)",new String[]{"张三","123"});//执行有占位符的SQL语句
ToastUtil.showToast(this,"插入数据成功");
//执行查询语句,带有占位符
queryData();
db.execSQL("update tbl_user set name='lisi' where _id=?",new String []{"22"});
queryData();
//db.execSQL("delect from tbl_user where id=?",new String[]{"2"});
}
private void queryData() {
Cursor cursor = db.rawQuery("select * from tbl_user where _id=?",new String[] {"22"});
while (cursor.moveToNext())
{
int id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String passwd = cursor.getString(cursor.getColumnIndex("passwd"));
Log.i("FourthActivity",id+ " "+name + " // "+passwd);
}
}
//写入按钮的监听
public void write(View view)
{
String content = mEt_writeData.getText().toString();
}
//读取按钮的监听
public void read(View view)
{
FileInputStream fis = null;
}
}
六、 用Android的API完成数据库的增删改查
1、声明一个数据库对象
SQLiteDatabase db;
2、实例化数据库对象
Db = SQLiteDatabase.openOrCreateDatabase(getFileDir()+”/my.db”,null);
3、创建表
db.execSQL(“create table tbl_user2 (_id integer primary keyautoincrement,name text,passwd varchar(10))”);
4、插入数据
ContentValues是一种键值存储机制,只能存放基本数据类型
ContentValues values = new ContentValues();
Values.put(“name”,”zhangsan”);
Values.put(“passwd”,”1213”);
第一个参数:表名,第二个参数:字段值,第三个参数:ContentValues对象
Db.insert(“tbl_user2”,null,values);
5、查询数据
/**
*第一个参数;是否查询相同的值
* 第二个参数:表名
* 第三个参数:需要查询的字段名 new String[] {"name","passwd"}
* 第四个参数:查询条件
* 第五个参数:占位符的值
* 第六个参数:分组查询
* 第七个参数:组函数的过滤条件
* 第八个参数:按照指定的顺序显示数据
* 第九个参数:分页处理
*/
Cursor cursor =db.query(false,”tbl_user2”,new String[]{“name”,passed},”_id=?”,
New String[]{“1”},null,null,”_idasc,null”);
while (cursor.moveToNext())
{
//int id =cursor.getInt(cursor.getColumnIndex("_id"));
String name =cursor.getString(cursor.getColumnIndex("name"));
String passwd =cursor.getString(cursor.getColumnIndex("passwd"));
Log.i("Fourth2Activity"," "+name+" "+passwd);
}
6、修改数据
/**
* 第一个参数:表名
* 第二个参数:contentvalues的值
* 第三个参数:查询条件
* 第四个参数:查询占位符的值
*/
ContentValues values = new ContentValues();
values.put("name","briup2");
values.put("passwd","456");
db.update("tbl_user2",values,"_id=?",newString[]{"1"});
7、删除数据
db.delete("tbl_user","_id=?",newString[]{"1"});
public class Fourth2Activity extends AppCompatActivity {
private SQLiteDatabase db;//申明一个数据库对象
private String sql;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 第一个参数:文件路径名,绝对路径
* 第二个参数:Cursor工厂类对象,与ResultSet类似,
* 值一般为空,表示采用系统默认的工厂类
*/
db = SQLiteDatabase.openOrCreateDatabase(getFilesDir()+"/my.db",null);
ToastUtil.showToast(this,"数据库创建成功");
//建表
//sql = "create table tbl_user2 (_id integer primary key autoincrement,name text,passwd varchar(10))";
// db.execSQL(sql);
//ToastUtil.showToast(this,"建表成功");
//添加数据
addData();
//ToastUtil.showToast(this,"添加成功");
//查询数据
queryData();
//修改数据
updataData();
queryData();
//删除数据
//delectData();
ToastUtil.showToast(this,"删除成功");
}
//删除数据
private void delectData() {
/**
* 第一个参数:表名
* 第二个参数:查询条件
* 第三个参数:占位符的值
*/
db.delete("tbl_user","_id=?",new String[]{"1"});
}
//修改数据
private void updataData() {
/**
* 第一个参数:表名
* 第二个参数:contentvalues的值
* 第三个参数:查询条件
* 第四个参数:查询占位符的值
*/
ContentValues values = new ContentValues();
values.put("name","briup2");
values.put("passwd","456");
db.update("tbl_user2",values,"_id=?",new String[]{"1"});
ToastUtil.showToast(this,"修改成功");
}
//查询数据
private void queryData() {
/**
*第一个参数;是否查询相同的值
* 第二个参数:表名
* 第三个参数:需要查询的字段名 new String[] {"name","passwd"}
* 第四个参数:查询条件
* 第五个参数:占位符的值
* 第六个参数:分组查询
* 第七个参数:组函数的过滤条件
* 第八个参数:按照指定的顺序显示数据
* 第九个参数:分页处理
*
*/
Cursor cursor = db.query(false,"tbl_user2",new String[]{"name","passwd"},"_id=?",new String[]{"1"},null,null,"_id asc",null);
//ToastUtil.showToast(this,"查询成功");
while (cursor.moveToNext())
{
//int id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String passwd = cursor.getString(cursor.getColumnIndex("passwd"));
System.out.println(name+"sdf");
Log.i("Fourth2Activity", " "+name+" "+passwd);
ToastUtil.showToast(this,name);
ToastUtil.showToast(this,"查询成功");
}
}
//添加数据
private void addData() {
/**
* 第一个参数:表的名字
* 第二个参数:字段的值永远为空值
* 第三个参数;Contentvalues对象
*/
ContentValues values = new ContentValues();
values.put("name","briup");
values.put("passwd","123");
db.insert("tbl_user2",null,values);
ToastUtil.showToast(this,"插入成功");
}
}
本文详细介绍Android应用中的多种数据存储方式,包括文件存储、SharedPreferences、SQLite数据库等,涵盖基本操作及注意事项。
321

被折叠的 条评论
为什么被折叠?



