【Android】数据存储_问答

保存数据到文件


在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.

猜你喜欢

转载自blog.csdn.net/qq_43763494/article/details/105865051
今日推荐