数据库详解

来源:互联网 发布:哈希map java 编辑:程序博客网 时间:2024/05/19 13:14
数据存储:
1、SharedPreferences:共享参数存储
存储的文件路径
/data/data/{appPackageName}/shared_prefs/{filename}

以键值对形式进行存储
目前支持String、int、long、float、boolean
常常用来存储以下简单信息
比如,账号,上一次配置信息等

使用步骤:
1、getSharedPreferences(String, int mode):获取共享参数对象
mode取值:
MODE_APPEND:追加
MODE_PRIVATE:私有

2、调用edit()方法获取SharedPreferences.Editor:编辑对象
3、操作编辑对象
通过SharedPreferences.Editor接口提供的put()方法对SharedPreferences进行更新
put(String key,Object Value):添加或修改
remove(String key):移除指定键的元素
commit:提交修改

SharedPreferences:常用方法
getXXX
getAll:所有数据
contains(String key):验证指定的键是否存在
edit:获取编辑对象



2、内部存储
每个手机都默认拥有内部存储
存储路径:/data/data/{appPackageName}/files/{filename}

openFileOutput (String filename, int mode):文件输出字节流:用于数据的写出
openFileInput (String filename):文件输入字节流:用于数据的读取
fileList:获取内部存储目录(files)所有的文件名称
deleteFile(String filename):删除指定名称的内部存储文件


3、扩展存储(外部/SDCard存储):
Environment:操作扩展存储的类

存储路径:/storge/sdcard/
获取sdcard状态: String Environment.getExternalStorageState()
Environment.MEDIA_MOUNTED 介质已加载完,这个状态的扩展存储方可进行读写操作
获取公共目录: Environment.getExternalStoragePublicDirectory(String type)
一般的公共目录:
Environment.DIRECTORY_MOVIES:视频
Environment.DIRECTORY_MUSIC:音频
Environment.DIRECTORY_DOCUMENTS:文档
Environment.DIRECTORY_DOWNLOADS:下载
Environment.DIRECTORY_PICTURES:图片
Environment.DIRECTORY_RINGTONES:铃声

获取根目录:Environment.getExternalStorageDirectory()
获取下载缓存目录:Environment.getDownloadCacheDirectory()

常用的权限:
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>   在sdcard中创建与删除文件的权限
读权限:android.permission.READ_EXTERNAL_STOARAGE
读写权限:android.permission.WRITE_EXTERNAL_STOARAGE


记住:只要有目录,有绝对路径,我们就可以用我们学过的流进行数据的读取或保存


4、Sqlite存储:
SQLite常用语句:
1、建表语句:CREATE TABLE news(_id integer primary key autoincrement title text,content text,path text,time long)
2、更新表:alter table 表名 ADD COLUMN degree float;给表插入数据类型为float的degree字段
3、删除表语句:drop table if exists 表名;
4、插入语句: insert into 表名(字段名,字段名) values(添加的内容,添加的内容);
5、修改update语句:update news set title = abc where _id = 1
6、delete语句:delete from news where _id = 2
7、Select语句:select title,content,path from news order by _id desc


分页查询:
前n条数据: select * from table_name limit 1
从m开始显示n条数据:  select * from table_name limit m,n

SQLiteDatabase:等同于JDBC中Connection和Statement的结合体,既代表与数据库的连接,又能用于执行sql语句操作。
获取数据库操作对象:
SQLiteDatabase openOrCreateDatabase(String path,CursorFactory)
SQLiteDatabase openDatabase (String path, CursorFactory, int flags)

insert (String table, String nullColumnHack, ContentValues values)
update (String table, ContentValues values, String whereClause, String[] whereArgs)
delete (String table, String whereClause, String[] whereArgs)
Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
Cursor rawQuery (String sql, String[] selectionArgs)



通过SqliteOpenHelper,获取的数据库操作对象
路径:/data/data/包名/database/数据库文件名
作用:
1、初次使用软件时创建出数据库表结构及添加一些初始化记录
onCreate(SQLiteDatabase db) 第一次创建数据库的初始化方法
2、软件升级的时候,也需要对数据表结构进行更新。
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 数据库更新

getWritableDatabase()与getReadableDatabase()的区别?
Android使用getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。
(getReadableDatabase()方法中会调用getWritableDatabase()方法)
getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,
数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。
getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。【推荐使用】


Cursor:查询结果集
存储查询的结果nm.notify(1, bd.build());
常用方法:
move(int offset)    按偏移量来移动
moveToFirst()   将记录指针移动到第一行
moveToLast ()   将记录指针移动到最后一行
moveToNext ()      将记录指针移动到下一行
moveToPosition(int position)       将记录指针移动到指定的一行
moveToPrevious()      将记录指针移动到上一行
getCount()    返回Cursor的行数
getColumnName(int index)    根据列的索引返回其相应的列名称
getColumnIndex(String name)    根据列的名字返回其相应的索引
getColumnNames()       返回一个保存有所有列名称的字符串数组
getColumnCount()    返回列的总数
close()   关闭游标结果集,释放资源
getType()    获取字段的数据类型。分别有0、1、2、3、4这几个结果。
0: 代表null
1:代表int
2:代表float
3:代表String
4:代表blob

事务:Transaction
数据库事务(Database Transaction) ,
是指作为单个逻辑工作单元执行的一系列操作,要么完整地执行,要么完全地不执行。
事务的目的是为了保证数据的一致性。 事务通过回滚(RollBack)保存了数据了一致性。

使用示例:

使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。使用例子如下:
SQLiteDatabase db = ....;
db.beginTransaction();//开始事务
try {
    db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"千锋", 4});
    db.execSQL("update person set name=? where personid=?", new Object[]{"千锋", 1});
    db.setTransactionSuccessful();//调用此方法会在执行到endTransaction() 时提交当前事务,如果不调用此方法会回滚事务
} finally {
    db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务
}
db.close();
上面两条SQL语句在同一个事务中执行。



SimpleCurosrAdapter:简单数据库适配器
是一个将 Cursor 中的 columns 与在 XML 布局文件中定义的 控件进行匹配的简易 adapter。
或者说,SimpleCursorAdapter 允许绑定一个 Cursor 的 columns 到 ListView 上,并使用自定义的 layout 显示 List中的每个项目。
SimpleCursorAdapter 作为中间桥梁,将从 sqlite 数据库中查询出来的数据直接显示到 ListView 中。





0 0