Android数据存储与访问
1)保存到手要内存,文件保存到/data/data对应的应用程序包下面
如 FILE_PATH = "/data/data/com.diysoul.filedemo/info.dat"
可通过Context的方法取得包名对应的文件夹来保存文件 /data/data/包名/files/
File fileDir = getFilesDir();
/data/data/包名/cache/
getCacheDir();
再加入文件名来保存文件
File filePath = new File(fileDir, "info.dat");
存储
FileOutputStream fos = new FileOutputStream(FILE_PATH);
fos.write(stringInput.getBytes());
fos.flush();
fos.close();
读取
FileInputStream fis = new FileInputStream(FILE_PATH);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
String strInfo = reader.readLine();
2)保存到SD卡
存储和读取SD卡中的数据需要配置权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
首先取得SD卡的状态
String state = Environment.getExternalStorageState();
if(!Environment.MEDIA_MOUNTED.equals(state))
{
return "";
}
取得SD卡的位置
File fileSDCard = Environment.getExternalStorageDirectory();
创建文件
File file = new File(fileSDCard, FILE_NAME);
存储
FileOutputStream fos = new FileOutputStream(file);
fos.write(stringInput.getBytes());
fos.flush();
fos.close();
读取
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
reader.readLine();
3).使用Context的方法保存文件
相关方法在 /data/data/包名/files/ 下创建文件
FileOutputStream fos = context.openFileOutput(FILE_NAME, mode);
FileInputStream fis = context.openFileInput(FILE_NAME);
FILE_NAME用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android会自动创建它。创建的文件保
存在/data/data/<package name>/files目录
mode指定用于指定操作模式,
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖
原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入:
openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
注意:1).模拟器如果未指定SD卡的大小,则state将返回removed,表示没有SD卡!
2).android文件权限在DDMS中可以看到
android文件权限
- --- --- ---
第1位:d为文件夹,-为普通文件,l为挂载某一个文件
第2-4位:代表当前用户的权限,如 rw- = 110 = 6
第5-7位:代表当前用户所在组的其它组员的权限
第8-10位:代表所有的权限
---没有任何权限,r--可读,-w-可写,rw-可读可写,--x可执行
2.使用SharedPreferences对象
创建文件时默认会添加后缀名xml
存储
// 文件保存在 /data/data/包名/shared_prefs/
SharedPreferences sharePreference = context.getSharedPreferences(
FILE_NAME, Context.MODE_APPEND);
// 取得Editor对象
Editor editor = sharePreference.edit();
// 写入数据
editor.putString(INFO, stringInput);
// 提交,保存到物理磁盘
editor.commit();
读取
// 文件保存在 /data/data/包名/shared_prefs/
SharedPreferences sharePreference = context.getSharedPreferences(FILE_NAME, Context.MODE_APPEND);
// 读数据
String result = sharePreference.getString(INFO, "");
权限同上
3.数据库SQLite3
1).通过继承SQLiteOpenHelper类开发子类,使用getReadableDatabase和getWritableDatabase方法取得数据库对象,操作数据库。开发者需要做的只是重写两个方法即可。
package com.diysoul.sqlitedemo.db; import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; /**
* @author John 数据库帮助类,用于创建和管理数据库
*/
public class MySqliteHelper extends SQLiteOpenHelper { /**
* 数据库文件名称
*/
private static String stringName = "Person.db"; /**
* 数据库版本号,不能小于1
*/
private static int version = 1; /**
* @param context
* 上下文
* @param name
* 数据库文件名
* @param factory
* 游标工厂
* @param version
* 版本号
*/
public MySqliteHelper(Context context) {
super(context, stringName, null, version);
} /**
* 数据库创建时的回调方法,初始化表
*/
@Override
public void onCreate(SQLiteDatabase db) {
// 操作数据库
//1.创建表
String sql = "create table person(_id integer primary key autoincrement, name varchar(20), age interger);";
db.execSQL(sql);
//AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY (code 1): , while compiling: create table person(id interger primary key autoincrement, name varchar(20), age interger); } /**
* 数据库版本号更新时回调此方法,更新数据库的内容,包括增加表,删除表,或修改表
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
} }
对于sql语句,在java代码中无法检查出错误,可以在PC端数据库软件SQLite Expert Personal 3(百度盘有备份)中运行,确认没有问题再添加到代码中,将需要动态传入的参数用‘?’代替,加入参数即可。
// 1.创建表
create table person(_id integer primary key autoincrement, name varchar(20), age interger);
// 2.插入数据
insert into person(name, age) values('lsi', 24);
insert into person(name, age) values('王二', 24);
db.execSQL("insert into person(name, age) values(?, ?);",
new Object[] { person.getName(), person.getAge() });
// 3.删除数据
delete from person where _id = 2;
db.execSQL("delete from person where _id = ?;", new Object[] { id });
// 4.更新数据
update person set name = 'tt' where name = '王二'
update person set name = 'zhangshan' where name = 'tt'
db.execSQL("update person set name = ?, age = ? where _id = ?;",
new Object[] { person.getName(), person.getAge(),
person.getId() });
// 5.查询数据
select * from person;
select * from person where _id > 2;
Cursor cursor = db.rawQuery("select _id, name, age from person;", null);
Cursor cursor = db.rawQuery("select _id, name, age from person where _id = ?;",
new String[] { String.valueOf(id) });
通过cursor读出需要的数据
if (cursor != null && cursor.getCount() > 0) {
int id;
String name;
int age;
while (cursor.moveToNext()) {
id = cursor.getInt(0);// 第0列 对应 _id
name = cursor.getString(1); // 第1列 对应 name
age = cursor.getInt(2); // 第2列 对应 age
list.add(new Person(id, name, age));
}
}
//查询一条语句
if (cursor != null && cursor.moveToFirst()) {
id = cursor.getInt(0); // 对应 _id
String name = cursor.getString(1); // 对应 name
int age = cursor.getInt(2); // 对应 age
person = new Person(id, name, age);
}
db对象:
MySqliteHelper mySqlHelper;
SQLiteDatabase db = mySqlHelper.getWritableDatabase();
//注意,每一次操作之后都需要关闭数据库
db.close();
Android数据存储与访问的更多相关文章
- Android数据存储方式--SharedPreferences
Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...
- 10、Android数据存储
课程目标: 掌握Android中数据存储的几种方式 熟练使用PreferenceActivity&PreferenceScreen做专业的Setting功能 熟练使用SQLite3来存储数据 ...
- Android - 数据存储 -存储文件
Android使用的文件系统和其他平台的基本磁盘的文件系统很相似.这里将要介绍如何使用File API在Android文件系统中读写文件. File对象适合按顺序读写大量的数据.例如,适合图片文件或者 ...
- Android - 数据存储 -存储键值对
如果你有少量的键值数据需要存储,可以使用SharedPreferencesAPI.SharedPreferences对象指向一个包含键值对的文件并且提供了一些简单的方法来读取它们.每个SharedPr ...
- 数据存储与访问之——初见SQLite数据库
本节引言: 本节学习Android数据库存储与访问的第三种方式:SQLite数据库,和其他的SQL数据库不同,我们并不需要在手机上另外安装一个数据库手机软件,Android系统已经集成了这 ...
- Android数据存储:SDCard
Android数据存储之SDCard 0.获取sd卡路径. 1.讲述 Environment 类. 2.讲述 StatFs 类. 3.完整例子读取 SDCard 内存 0.获取sd卡路径 方法一: p ...
- 【Android开发日记】之入门篇(七)——Android数据存储(上)
在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也 ...
- 【Android开发日记】之入门篇(八)——Android数据存储(下)
废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基 ...
- Android数据存储之SQLite数据库
Android数据存储 之SQLite数据库简介 SQLite的相关知识,并结合Java实现对SQLite数据库的操作. SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎. ...
随机推荐
- Java 集合学习--HashMap
一.HashMap 定义 HashMap 是一个基于散列表(哈希表)实现的键值对集合,每个元素都是key-value对,jdk1.8后,底层数据结构涉及到了数组.链表以及红黑树.目的进一步的优化Has ...
- lintcode 466. 链表节点计数
466. 链表节点计数 计算链表中有多少个节点. 样例 给出 1->3->5, 返回 3. /** * Definition of ListNode * class ListNode ...
- jQuery官网plugins栏目下那些不错的插件
前言: 很久以前就关注过jQuery官网plugins栏目下那些全是英文的插件,本人的英文水平很菜,想要全部看懂确实是件不易之事. 好在大部分的案例中都有 view-homepage 或 Try a ...
- ionic ios样式偏移解决方案。
在css属性内增加: .item-ios [item-end] { //解决ios系统上尾部图标出现重影而增加的格式. margin: 0px -15.3px 0px 0px; margin-bott ...
- [原创]Docker学习记录: Shipyard+Swarm+Consul+Service Discover 搭建教程
网上乱七八糟的资料实在是太多了, 乱, 特别乱, 而看书呢, 我读了2本书, 一本叫做<>, 另一本叫做<< Docker进阶与实战>> 在 服务发现这块讲的又不清 ...
- 3.hadoop完全分布式搭建
3.Hadoop完全分布式搭建 1.完全分布式搭建 配置 #cd /soft/hadoop/etc/ #mv hadoop local #cp -r local full #ln -s full ha ...
- 十一:Centralized Cache Management in HDFS 集中缓存管理
集中的HDFS缓存管理,该机制可以让用户缓存特定的hdfs路径,这些块缓存在堆外内存中.namenode指导datanode完成这个工作. Centralized cache management i ...
- VBA基础之Excel 工作薄(Book)的操作(三)
三. Excel 工作薄(Book)的操作1. Excel 创建工作薄(Book) Sub addWorkbook() Workbooks.Add End Sub 2. Excel 打开工作薄(Boo ...
- 软件工程 作业part3 读后感
匆匆看完构建之法,觉得这种不认真看完书就去写随笔去评价这本书是对作者的不尊重,所以觉得应该提问题和写感悟. 我的一点拙见,提的问题在现在这个信息发达的时候感觉只要有时间都可以自己解决. 感觉软件工程这 ...
- java多线程三之线程协作与通信实例
多线程的难点主要就是多线程通信协作这一块了,前面笔记二中提到了常见的同步方法,这里主要是进行实例学习了,今天总结了一下3个实例: 1.银行存款与提款多线程实现,使用Lock锁和条件Condition. ...