赞
踩
数据库管理系统(DBMS):是系统软件,是数据库系统的核心。
常见数据库管理系统有:Access、mysql、sql server
打开SQL Server 配置管理器:运行SQLServerManager10.msc命令。
SQL Server默认端口:1433
备份:数据库右击 -> 任务 -> 备份 -> 添加 -> 选择文件地址(文件类型选择所有文件) -> 依次确定
还原:新建数据库 右击 -> 任务 -> 还原 -> 数据库 -> 选项 -> 覆盖现有数据库 -> 常规 -> 源设备 -> 添加(文件类型选择全部文件,然后选择之前备份的文件) -> 还原
备份:数据库右击 -> 任务 -> 生成脚本 -> 选择特定数据库对象 -> 选择表,然后下一步 -> 高级(在最后的要编写脚本的数据的类型,选择架构和数据) -> 选择文件名,依次下一步至完成。
还原:新建数据库,文件 -> 打开 -> 文件 -> 打开对应sql文件,执行即可。
分为临时表和永久表。
临时表存储在tempdb中(如下),当不再使用时会自动删除。
--SQLSERVER
IF OBJECT_ID('tempdb..#ownerAnnouce') IS NOT NULL
进程独立,只有进程的拥有者有表的访问权限,其它用户不能访问该表;
不同的用户进程,创建的临时表虽然“名字”相同,但是这些表之间相互并不存在任何关系;在SQLSERVER中,通过特别的命名机制保证临时表的进程独立性。
临时表有两种类型:本地和全局。
名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。
名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。
真正的临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。
A. create table #临时表名
B.select * into #临时表名 from 表名(永久表或临时表)
sqlite是一款轻量级数据库,是遵守ACID(指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability))的关系型数据库管理系统。在嵌入式设备中,可能只需要几百K的内存就够了。
SQLite默认是打开事务的。
android手机root之后,就可以在/data/data/包名/database/目录中查看sqlite数据库。所以,对于敏感信息,应该考虑加密。
SQLite不支持加密,所以我们针对数据库文件加密。现有两种解决方案:
①优点:
加密速度快。
程序无须变动,只针对数据进行加密。
②缺点:
来回加密,造成处理数据缓慢。
仅对数据加密,依然可以看到数据表的sql语句,可能猜测到表的作用。
③实现:
一是:对明文数据进行加密返回密文数据
二是:对密文数据进行解密返回明文数据
①优点
对整个文件进行了加密,用户通过编辑器看不到任何有用的数据。
进行数据库打开时,使用程序即可解密文件。
②缺点
需要修改sqlite源码,这个工作难度比较大。
③实现(太难,本人并没有进行实验)
a.修改sqlite源代码,追加对数据库文件进行加密的功能。
b.编译含有加密功能的程序源代码,生成各自平台需要使用的库文件。
c.将加密sqlite库文件引入各自平台中,修改数据库访问层代码。
d.进行程序的部署,测试。
Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的api。
我们往往不会直接操作SQLiteDatabase这个类,而是自己创建一个继承自SQLitOpenHelper的子类来实现数据库操作。
这样做的目的一是为了以后如果数据库升级不至于要改动太多代码,已实现封装;二则是为了我们使用更方便。
通过getWriteableDatabase和getReadableDatebase()方法生成一个数据库,并对数据库进行管理。
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
需要实现两个抽象方法:OnCreate和OnUpgrade。
当Android应用运行时,SQLiteOpenHelper会先检查是否已经存在数据库,如果不存在,就创建数据库,然后打开数据库,最后调用OnCreate方法,所以我们需要再OnCreate中创建表(视图等);如果数据库已存在,而版本号比上次创建的数据库版本号高,就调用OnUpgrade,用于升级。
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class MyHelper extends SQLiteOpenHelper {
private String Tag = "MyHelper";
private static String DB_NAME = "luoDB.db"; //数据库名称
public static String TABLE_NAME_TASK = "Task"; //联班任务_fra_task表名
/**super(参数1,参数2,参数3,参数4),其中参数4是代表数据库的版本,
* 是一个大于等于1的整数,如果要修改(添加字段)表中的字段,则设置
* 一个比当前的 参数4大的整数 ,把更新的语句写在onUpgrade(),下一次
* 调用
*/
public MyHelper(Context context) {
super(context, DB_NAME, null, 1);
}
//用于第一次创建数据库
@Override
public void onCreate(SQLiteDatabase db) {
//Create table
try{
String sql = "CREATE TABLE "+TABLE_NAME_TASK + "("
+ "TaskCode TEXT PRIMARY KEY,"
+ "TaskState TEXT,"
+ "TaskName TEXT"
+ ");";
db.execSQL(sql); //创建表
}catch(Exception e){
LogUtil.i(Tag, "onCreate" + e.getMessage());
}
}
//用于数据库升级
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
数据库升级增加表和删除表都不涉及数据迁移,但是修改表涉及到对原有数据进行迁移。升级的方法如下所示:
将现有表命名为临时表。
创建新表。
将临时表的数据导入新表。
删除临时表。
如果是跨版本数据库升级,可以由两种方式,如下所示:
逐级升级,确定相邻版本与现在版本的差别,V1升级到V2,V2升级到V3,依次类推。
跨级升级,确定每个版本与现在数据库的差别,为每个case编写专门升级大代码。
MyHelper类中:
public void insert(String table, String nullColumnHack, ContentValues values){
SQLiteDatabase db = this.getWritableDatabase();
db.insert(table, nullColumnHack, values);
}
参数说明:
table:表名,直接使用字符串指定;
nullColumnHack:指定null值的列,SQLite里不允许空行,使用这个参数可以指定一个列的值为null,当存入行为空时,这个列的值就被指定为null;
values:使用类似map键值对映射的数据结构ContentValues来指定插入的数据
举例:
String[] args = {
today,
content,
Boolean.toString(checked)
};
String[] column = {
"[_Date]",
"[Item]",
"[Check]"
};
//数据库中添加数据
ContentValues c = new ContentValues();
for(int i=0;i<args.length;i++){
c.put(column[i], args[i]);
}
dbServices.insert("_today_plan", null, c);
MyHelper类中:
public void delete(String table , String whereClause , String[] whereArgs){
SQLiteDatabase db = this.getWritableDatabase();
db.delete(table, whereClause, whereArgs);
Log.d("Delete",whereClause);
}
参数说明:
table:表名;
whereClause:可选,指定删除条件,相当于SQL语句WHERE语句之后的类容,可通过?来指定参数;
whereArgs:当whereClause指定了?参数,这个字符串数组里就是?所代表的参数,个数应与?数一致;
举例:
String args[] ={
today,
content,
Boolean.toString(checked)
};
dbServices.delete("_today_plan", "[_Date]=? and [Item]=? and [Check]=?"
,args);
MyHelper类中:
public void update(String table, ContentValues values,
String whereClause, String[] whereArgs){
SQLiteDatabase db = this.getWritableDatabase();
db.update(table, values, whereClause, whereArgs);
}
参数说明:
table:表名;
values:同上,是需要修改的列和值的映射集合;
whereClause:修改的行所需符合的条件;
whereArgs:指定条件里的参数;
示例:
String args[] ={
today,
content,
Boolean.toString(!m)
};
ContentValues c = new ContentValues();
c.put("[Check]", Boolean.toString(m));
dbServices.update("_today_plan", c,"[_Date]=? and [StartTime]=? and [Item]=? and [Check]=?"
,args);
MyHelper类中:
和前面有所不同了,读取数据所用的方法是直接执行查询语句,获取游标,然后通过游标来遍历数据库,方法如下:
public Cursor read(String sql ,String[] args){
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(sql, args);
Log.d("Database",cursor.getColumnName(0));
return cursor;
}
方法说明:
请注意:在这里db获取的是只读的数据库(getReadableDatabase),而在上述三种操作里都是使用的可写数据库(getWritableDatabase);至于游标的用法此处就不再赘述,只需看一下API的名字就能掌握基本用法,但最后一定要记得将游标关闭(close)!
cursor = db.query(MyHelper.TABLE_NAME_TASK,
new String[] { "TaskCode","TaskName"}, "TaskName like ?",
new String[]{"%" + TaskName + "%"}, null, null, null);
Cursor c_test = mDatabase.query(tab_name,
new String[]{tab_field02},
tab_field02+" like '%" + str[0] + "%'", null, null, null, null);
String current_sql_sel = "SELECT * FROM "+tab_name
+" where "+tab_field02
+" like '%"+str[0]+"%'";
Cursor c_test = mDatabase.rawQuery(current_sql_sel, null);
cursor = db.query(MyHelper.TABLE_NAME_TASK,
new String[] { "TaskCode", "TaskName","TaskState"}, "TaskName like ?",
new String[]{"%" + TaskName+ "%"}, null, null,
"(case"
+ " when TaskState like '" + TaskState.STATE2 + "' then 2"
+ " when TaskState like '" + TaskState.STATE1 + "' then 1"
+ " else 3"
+ " end)"
+ ",TaskCode asc");
是指一个或多个更改数据库的扩展。例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务。重要的是要控制事务以确保数据的完整性和处理数据库错误。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。