当前位置:   article > 正文

【数据库学习】数据库平台:Access,sql server,sqlite_sqlite端口

sqlite端口

数据库管理系统(DBMS):是系统软件,是数据库系统的核心。
常见数据库管理系统有:Access、mysql、sql server

1,Access

2,sql server

1)应用

打开SQL Server 配置管理器:运行SQLServerManager10.msc命令。
SQL Server默认端口:1433

2)备份与恢复

i>所有文件 备份与恢复

备份:数据库右击 -> 任务 -> 备份 -> 添加 -> 选择文件地址(文件类型选择所有文件) -> 依次确定
还原:新建数据库 右击 -> 任务 -> 还原 -> 数据库 -> 选项 -> 覆盖现有数据库 -> 常规 -> 源设备 -> 添加(文件类型选择全部文件,然后选择之前备份的文件) -> 还原

ii>sql文件 备份与恢复

备份:数据库右击 -> 任务 -> 生成脚本 -> 选择特定数据库对象 -> 选择表,然后下一步 -> 高级(在最后的要编写脚本的数据的类型,选择架构和数据) -> 选择文件名,依次下一步至完成。
还原:新建数据库,文件 -> 打开 -> 文件 -> 打开对应sql文件,执行即可。

3)语法

1>表

分为临时表和永久表。

a)临时表

临时表存储在tempdb中(如下),当不再使用时会自动删除。

--SQLSERVER
IF OBJECT_ID('tempdb..#ownerAnnouce') IS NOT NULL
  • 1
  • 2

进程独立,只有进程的拥有者有表的访问权限,其它用户不能访问该表;
不同的用户进程,创建的临时表虽然“名字”相同,但是这些表之间相互并不存在任何关系;在SQLSERVER中,通过特别的命名机制保证临时表的进程独立性。

临时表有两种类型:本地和全局。

A.本地临时表

名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。

B.全局临时表

名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。

临时表优点

真正的临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。

临时表的创建

A. create table #临时表名
B.select * into #临时表名 from 表名(永久表或临时表)

3,android之sqlite

①概念

sqlite是一款轻量级数据库,是遵守ACID(指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability))的关系型数据库管理系统。在嵌入式设备中,可能只需要几百K的内存就够了。
SQLite默认是打开事务的。

②安全性

android手机root之后,就可以在/data/data/包名/database/目录中查看sqlite数据库。所以,对于敏感信息,应该考虑加密。

SQLite不支持加密,所以我们针对数据库文件加密。现有两种解决方案:

i>对数据库中的数据进行加密

①优点:
加密速度快。
程序无须变动,只针对数据进行加密。
②缺点:
来回加密,造成处理数据缓慢。
仅对数据加密,依然可以看到数据表的sql语句,可能猜测到表的作用。
③实现:
一是:对明文数据进行加密返回密文数据
二是:对密文数据进行解密返回明文数据

ii>对数据库文件进行加密

①优点
对整个文件进行了加密,用户通过编辑器看不到任何有用的数据。
进行数据库打开时,使用程序即可解密文件。
②缺点
需要修改sqlite源码,这个工作难度比较大。
③实现(太难,本人并没有进行实验)
a.修改sqlite源代码,追加对数据库文件进行加密的功能。
b.编译含有加密功能的程序源代码,生成各自平台需要使用的库文件。
c.将加密sqlite库文件引入各自平台中,修改数据库访问层代码。
d.进行程序的部署,测试。

③SQLiteDatabase

Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的api。

④SQLitOpenHelper

我们往往不会直接操作SQLiteDatabase这个类,而是自己创建一个继承自SQLitOpenHelper的子类来实现数据库操作。
这样做的目的一是为了以后如果数据库升级不至于要改动太多代码,已实现封装;二则是为了我们使用更方便。
通过getWriteableDatabase和getReadableDatebase()方法生成一个数据库,并对数据库进行管理。

i>在AndroidManifest.xml中添加权限

    <!-- 在SDCard中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />    
    <!-- 往SDCard写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • 1
  • 2
  • 3
  • 4

ii>添加继承SQLiteOpenHelper的MyHeper类,用于创建使用数据库。

需要实现两个抽象方法: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) {
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

iii>SQLite升级

数据库升级增加表和删除表都不涉及数据迁移,但是修改表涉及到对原有数据进行迁移。升级的方法如下所示:

将现有表命名为临时表。
创建新表。
将临时表的数据导入新表。
删除临时表。
  • 1
  • 2
  • 3
  • 4

如果是跨版本数据库升级,可以由两种方式,如下所示:

逐级升级,确定相邻版本与现在版本的差别,V1升级到V2,V2升级到V3,依次类推。
跨级升级,确定每个版本与现在数据库的差别,为每个case编写专门升级大代码。
  • 1
  • 2

iv>数据的增——insert

MyHelper类中:

public void insert(String table, String nullColumnHack, ContentValues values){
    SQLiteDatabase db = this.getWritableDatabase();
    db.insert(table, nullColumnHack, values);
}
  • 1
  • 2
  • 3
  • 4

参数说明:
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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

v>数据的删——delete

MyHelper类中:

    public void delete(String table , String whereClause , String[] whereArgs){
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(table, whereClause, whereArgs);
        Log.d("Delete",whereClause);
    }
  • 1
  • 2
  • 3
  • 4
  • 5

参数说明:
table:表名;
whereClause:可选,指定删除条件,相当于SQL语句WHERE语句之后的类容,可通过?来指定参数;
whereArgs:当whereClause指定了?参数,这个字符串数组里就是?所代表的参数,个数应与?数一致;

举例:

String args[] ={
    today,
        content,
        Boolean.toString(checked)
};
dbServices.delete("_today_plan", "[_Date]=? and [Item]=? and [Check]=?"
,args);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

vi>数据的修改——update

MyHelper类中:

public void update(String table, ContentValues values,
        String whereClause, String[] whereArgs){
        SQLiteDatabase db = this.getWritableDatabase();
        db.update(table, values, whereClause, whereArgs);
    }
  • 1
  • 2
  • 3
  • 4
  • 5

参数说明:
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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

vii>数据的查询——read

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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

方法说明:
请注意:在这里db获取的是只读的数据库(getReadableDatabase),而在上述三种操作里都是使用的可写数据库(getWritableDatabase);至于游标的用法此处就不再赘述,只需看一下API的名字就能掌握基本用法,但最后一定要记得将游标关闭(close)!

⑤模糊查询

i>使用这种query方法%号前不能加’

			cursor = db.query(MyHelper.TABLE_NAME_TASK, 
					new String[] { "TaskCode","TaskName"}, "TaskName like ?",
					new String[]{"%" + TaskName + "%"}, null, null, null);		
  • 1
  • 2
  • 3

ii>使用这种query方法%号前必须加’

			Cursor  c_test = mDatabase.query(tab_name, 
					new String[]{tab_field02},
					tab_field02+"  like '%" + str[0] + "%'", null, null, null, null);
  • 1
  • 2
  • 3

iii>使用这种方式必须在%号前加’

			String current_sql_sel = "SELECT  * FROM "+tab_name 
									+" where "+tab_field02
									+" like '%"+str[0]+"%'";
			Cursor c_test = mDatabase.rawQuery(current_sql_sel, null);
  • 1
  • 2
  • 3
  • 4

⑥多重排序,字符串排序

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");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

⑦事务(Transaction)

是指一个或多个更改数据库的扩展。例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务。重要的是要控制事务以确保数据的完整性和处理数据库错误。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/681653
推荐阅读
相关标签
  

闽ICP备14008679号