【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 中声明权限
在对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.
Earnest~ 原创文章 95获赞 190访问量 2万+ 关注 私信 展开阅读全文作者:Earnest~
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341