保存数据到文件
在android设备中什么是internal和external存储区?
- internal,内部存储区,不易失,保存的文件是 app 私有的
- external,外部存储区,分为可移除和内部分区,不是总可用的,不具有保密性 (world-readable)
外部存储可存储两种类型的文件,public 和 private,后者随 app 删除而删除
其中 private 文件属于 app,虽在技术上可以被用户与其它 app 访问,但对于他们而言没有意义
默认情况下,app是安装在哪种存储区中?如何改变到其他存储区?
- internal
- 可通过清单文件中的
android:installLocation
属性更改
internal存储区的目录结构通常是怎样的?
- 通常为
data/data/app_name/
在internal存储区存放文件的时候,通过哪些方法获取内部存储的目录对象?对文件操作及流操作模糊的同学请回到java复习相关知识
getFilesDir() 返回一个代表 internal 目录的 File 对象
getDir(name,mode) 在 internal 目录中创建或者打开一个目录
getCacheDir() 返回一个用于存放你的 app 临时 缓存文件的 internal 目录
File file = new File(getApplicationContext().getFilesDir(), filename);
向internal存储区写文件的代码模板是怎么样的?请理解。
public void save(View view) {
EditText et_input = (EditText) findViewById(R.id.et_input);
String content = et_input.getText().toString();
String filename = "data.txt";
FileOutputStream fos;
try {
fos = openFileOutput(filename, Context.MODE_PRIVATE);
fos.write(content.getBytes());
fos.close();
Toast.makeText(this, getString(R.string.success), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
从internal存储区读文件的代码模板是怎样的?请理解。
byte[] buffer = new byte[fis.available()]; //测试 byte 数组的大小
fis.read(buffer);
content = new String(buffer);
还有
//按字符读
int ch;
ch = fis.read();
while(ch != -1) {
fileContent += (char)ch;
ch = fis.read();
}
- 详见 数据存储.
对external存储区进行读写的时候,应该在manifest文件中怎么设置?
- 在 manifest 中声明权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在对external存储区进行操作之前应该怎么做?为什么这么做?
- 检测是否可读可写
- 因为 external storage 可能不可用,如SD卡被移除
在external存储区中能存放的文件分为哪两类?针对这两类文件,在获取存放目录对象的时候,采用什么方法调用?如果刚开始的时候,没有预定义的子目录用于存放你的文件,该怎么做?
- public 和 private
- 前者采用 getExternalStoragePublicDirectory 方法
后者采用 getExternalFilesDir 方法创建目录 - 给 getExternalFilesDir() 传递 null,它会返回你的 app 在外部存储下的私有的根目录
没懂
当用户在卸载app的时候,哪些内容是系统自动删除的,哪些是程序员需要关照删除的?
- 系统自动删除:internal storage 中的、external storage 中 private 的
- 手动删除:通过 getCacheDir 方式创建的缓存文件,还有一些不会再用到的文件
使用共享首选项 (Shared Preferences)
什么是SharedPreferences?
- 一个Shared Preferences对象指向一个保存键值对的文件,并且提供了简单的方法来读写它们
如何来创建或者访问一个sharedPreferences?
- getSharedPreferences 通过名字区分
- getPreferences 只需一个共享 preference 文件时
如何将键值对写入SharedPreferences文件中?注意不是使用SharedPreferences对象直接写入,而是使用SharedPreferences.Editor来写入数据
- edit 获取 editor,写入用 putString 等,提交用 commit 方法
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();
如何从SharedPreferences文件中读取数据?
- 用 getString、getInt 方法
int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
int highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);
序列化
什么是序列化?xml序列化的操作步骤
- 序列化是将对象状态转换为可保存或传输的格式的过程
- 1.创建文件
2.打开文件输出流
3.创建相应的序列化器
File file = new File(Environment.getExternalStorageDirectory(),"Person.xml");
FileOutputStream fos = new FileOutputStream(file);
XmlSerializer serializer = Xml.newSerializer();
- 然后 通过序列化器对转换进行操作.
什么是bean?bean中的成员变量一般为private的?那这种成员变量的值怎么进行设置与获取?
- 如果读写方法符合以下这种命名规范,那么这种
class
被称为 JavaBean
// 读方法:
public Type getXyz()
// 写方法:
public void setXyz(Type value)
- 对
- 外部不能直接访问,但可通过类中的 set get 方法对其进行设置与获取
有几种xml解析方式?PULL解析过程
- 三种,DOM解析、SAX解析和PULL解析
- 1.创建解析器
2.设置解析器的 xml 来源
3.获取当前事件类型,解析器状态
4.循环处理 xml
SQLite数据库
如何在命令行中进入sqlite的工作界面
- adb shell
如何让windows的控制台中正常显示sqlite中存放的汉字?
- 将控制台的字符编码切换为 utf-8 即可
chcp 65001
熟悉sqlite中的常用命令?
.open 数据库名称: 打开数据库,如果该数据库在磁盘中不存在,则创建并打开
.save 数据库名称: 如果 sqlite3 的启动是通过双击 windows 中的 sqlite3.exe 的图标打开的,系统会在内存中创建一个数据库,这个数据库如果需要存放到磁盘,则需要使用本命令进行存放。如果磁盘上如有同名的数据库,会覆盖
.databases: 用于列出数据库
.tables: 用于列出数据库中的数据表
定义contract类有什么用?
- Contract类 是一些常量的容器,它定义了 URI 的名字、表名、列名等
- Contract类允许你在同一个包下与其它类使用共同的常量
- 有助于数据库同 android 的 framework 很好的相容
定义helper类有什么用?熟悉该类中的常用方法
- getWriteableDatabase()或者getReadableDatebase()方法,创建或打开数据库
比较耗时,需放在后台线程中调用
execSQL、rawQuery、query这三个方法在用于查询时什么区别?为防止sql注入,我们最好选用哪个方法来作查询?
- execSQL 查询时使用 SQL 的 select 语句,无返回值
rawQuery方法与之类似,区别是返回一个 Cursor 对象
query 方法是 SQLiteDatabase 类中专门用来查询操作的方法 - query,避免sql注入
ContentValues是个什么类?怎么用?
- ContentValues 类中包含很多 get put 方法,通过 key 存值取值
ContentValues 对象,底层为 map 键值对,key 列名,value 列值 - 主要用来给数据库添加数据
public long insert (String table, String nullColumnHack, ContentValues values)
Cursor是什么类?怎么用?
- Cursor 是一个接口,用于作为存放查询的结果集
Cursor c = db.query(FeedEntry.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
//cursor 起始位置在 -1 处
cursor.moveToFirst(); //将读取点放在入口位置,read position
long itemId = cursor.getLong(cursor.getColumnIndexOrThrow(FeedEntry._ID));
List itemIds = new ArrayList<>();
while(cursor.moveToNext()) {
long itemId = cursor.getLong(cursor.getColumnIndexOrThrow(FeedEntry._ID));
itemIds.add(itemId);
}
cursor.close();
什么是事务?它的标准处理模式是怎样的?
- 事务就是一组 SQL 语句,针对数据库的一组操作
db.beginTransaction();
try {
...
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
Android中如何开启事务如何关闭事务
- 开启事务 beginTransaction 以EXCLUSIVE模式 (排他) 其它线程不可读写
beginTransactionNonExclusive 以IMMEDIATE模式 可读不可写
方法参数 (SQLiteTransactionListener transactionListener),该方法中有事务监听器 - 关闭事务 endTransaction
简要描述SQLiteOpenHelper的主要作用
- 用于创建数据库,调用 getWriteableDatabase 或 getReadableDatabase 方法
简要描述一下SQLite数据库
- 一款轻型的数据库,是遵守 ACID 的关系型 DBMS,包含在一个相对小的 C 库中
设计目标是嵌入式,占用资源非常低,支持主流操作系统,能跟多种编程语言结合
处理速度快于MySQL、PostgreSQL
简要写出Android中创建数据库的步骤.
- 首先创建一个 SQLiteOpenHelper 类的子类,例如 FeedReaderDbHelper
然后实例化该子类,调用 getWriteableDatabase 或 getReadableDatabase 方法创建数据库
FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper(getContext());
SQLiteDatabase db = mDbHelper.getWritableDatabase();
然后用 ContentValues 插入数据
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_ENTRY_ID, id);
这个方法
public long insert (String table, String nullColumnHack, ContentValues values)
- 在调用 getWriteableDatabase 方法是时候打开或创建了数据库
End.