SQLite數據庫

一.SQLite數據庫介紹

1.Android 系統中集成的輕量級的數據庫
2.特點:
輕量級 只用一個動態的庫, 是以單個文件的形式進行存取
跨平臺 支持多個操作系統
零配置 無需安裝, 直接使用
嵌入式 內嵌到手機中
3.在程序的內部可以通過數據庫的名稱訪問, 其他應用不能訪問
4.路徑: data/data/應用程序包名/database/ ****.db
5.存放的類型:
NULL 空值
INTEGER 整型(不用int)
VARCHAR 可變長度的字符數據
TEXT 文本字符串
BOOLEAN 布爾
DATE
TIME

二.數據庫核心類

1.SQLiteOpenHelper 數據庫的幫助類, “用於數據庫的創建和版本更新”
(1)定義一個類, 繼承SQLiteOpenHelper
(2)重寫構造方法 :提供數據庫的基本信息 : 上下文對象,數據庫名稱,Null,數據庫的版本號
(3)重寫父類的方法:
onCreate():第一次創建數據庫時調用, 只會執行一次 – “初始化表,初始化數據”
onUpgrade()
2.SQLiteDatabase 數據庫的操作類, “操作數據庫: 執行sql語句/增/刪/改/查”
(0)獲取SQLiteDatabase對象
(1)執行sql 語句
void execSQL(String sql,String[] bindArgs); 執行增刪改
Cusor rawQuery(String sql,String[] selectionArgs); 執行查詢
(2)執行方法 – 封裝好的方法 (適用於菜鳥級別的程序員)
insert() 插入數據
update() 修改數據
delete() 刪除數據
query() 查詢數據

三.SQL語句複習:

1.創建表:
create table student(_id integer primary key autoincrement,name varchar(30),age integer,address varchar(30));
2.添加數據:insert into student values(null,‘要甜雪’,18,‘北京市海淀區’);
3.修改數據:update student set age=13,address=‘河北省滄州市’ where name=‘要甜雪’;
4. 查詢數據:
select * from student where 字段 = ‘值’
模糊查詢: select * from 表名 where name like ‘%小%’
select * from student order by age desc 降序查詢
sum(列名) 求和
max(列名) 最大值
min(列名) 最小值
avg(列名) 求平均值
count(列名) 統計記錄數
5.刪除數據:delete from student where id=12;

四.數據庫簡單代碼:

舉例:創建一張表student(id name age address)
1.自定義類繼承SQLiteOpenHelper

注意:onCreate方法只會執行一次,如果想要修改表的字段,修改oncreate方法的話是不行的,需要刪除之前生成的數據庫
//TODO 1:定義類繼承SQLiteOpenHelper
public class MyHelper extends SQLiteOpenHelper {
//TODO 2: 構造
public MyHelper(Context context) {
super(context, “student.db”, null, 1);
}
//TODO 3:重寫父類的方法
/**
* 創建數據庫時調用, 只執行一次 – 初始化表, 初始化數據
* @param db 數據庫的操作類
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(“create table User(_id integer primary key autoincrement,Name varchar(20),Sex varchar(20),Age integer)”);
}

/**
 * 更新數據 --- 如果數據庫的 版本號發生變化, 執行該方法 --- 執行多次
 */
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}

}

五.代碼:

舉例:創建一張表student(id name age address)
1.自定義類繼承SQLiteOpenHelper

注意:onCreate方法只會執行一次,如果想要修改表的字段,修改oncreate方法的話是不行的,需要刪除之前生成的數據庫
//TODO 1:定義類繼承SQLiteOpenHelper
public class MyHelper extends SQLiteOpenHelper {
//TODO 2: 構造
public MyHelper(Context context) {
super(context, “student.db”, null, 1);
}
//TODO 3:重寫父類的方法
/**
* 創建數據庫時調用, 只執行一次 – 初始化表, 初始化數據
* @param db 數據庫的操作類
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(“create table student(_id integer primary key autoincrement,name varchar(20),age integer)”);
}

/**
 * 更新數據 --- 如果數據庫的 版本號發生變化, 執行該方法 --- 執行多次
 */
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}

}

2.根據表名定義實體類:Student.java

public class Student {
private int _id;
private String name;
private int age;

public Student(int _id, String name, int age) {
    this._id = _id;
    this.name = name;
    this.age = age;
}

public int get_id() {
    return _id;
}

public void set_id(int _id) {
    this._id = _id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

}

3.數據庫工具類,提供增刪改查方法,不要在Activity中執行SQL語句,做到MVC模式:

public class StudentDao {

MyHelper myHelper;
//提供構造方法:將數據庫創建出來
public StudentDao(Context context) {//傳遞上下文對象
    myHelper=new MyHelper(context);
}

/***
 * @param student 傳遞你要插入的對象
 * @return  插入是否成功
 */
public boolean add(Student student){
    //獲得數據庫對象,可讀可寫
    SQLiteDatabase db=myHelper.getWritableDatabase();
    //創建ContentValues對象,封裝你要插入的數據
    ContentValues values = new ContentValues();
    values.put("name",student.getName());
    values.put("age",student.getAge());
    long num=db.insert("student",null,values);
    //判斷是否插入成功
    if(num>0){
        return true;
    }else{
        return false;
    }
}

/***
 * 根據id刪除數據
 * @param id
 * @return  代表刪除的個數
 */
public int deleteById(int id){
    //獲得數據庫對象,可讀可寫
    SQLiteDatabase db=myHelper.getWritableDatabase();
    return  db.delete("student","id=?",new String[]{id+""});
}
/***
 * 根據name刪除數據
 * @param name
 * @return  代表刪除的個數
 */
public int deleteByName(String name){
    //獲得數據庫對象,可讀可寫
    SQLiteDatabase db=myHelper.getWritableDatabase();
    return  db.delete("student","name=?",new String[]{name+""});
}

/***
 * 根據id修改數據
 * @param student 傳遞你要修改成的對象
 * @return
 */
public int update(Student student,int id){
    //獲得數據庫對象,可讀可寫
    SQLiteDatabase db=myHelper.getWritableDatabase();
    //創建ContentValues對象,封裝你要插入的數據
    ContentValues values = new ContentValues();
    values.put("name",student.getName());
    values.put("age",student.getAge());
    return db.update("student",values,"id=?",new String[]{id+""});
}

/***
 *
 * @return 查詢所有的數據
 */
public ArrayList<Student> queryAll(){
    //獲得數據庫對象,可讀可寫
    SQLiteDatabase db=myHelper.getWritableDatabase();
    //創建集合
    ArrayList<Student> list = new ArrayList<>();
    //執行查詢語句
    Cursor cursor = db.query("student", null, null, null, null, null, null);
   //遍歷遊標
    while (cursor.moveToNext()){
        int id=cursor.getInt(cursor.getColumnIndex("_id"));
        String name=cursor.getString(cursor.getColumnIndex("name"));
        int age=cursor.getInt(cursor.getColumnIndex("age"));
        //創建對象存入集合中
        Student student = new Student(id, name, age);
        list.add(student);
    }
    return list;
}

}

4.執行增刪改查操作,將查詢到的數據展現在ListView中

public class Main2Activity extends AppCompatActivity {
private StudentDao dao;
private ListView listView;
private MyAdapter myAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listView=findViewById(R.id.lv);
    dao=new StudentDao(Main2Activity.this);
}
//TODO:插入數據
public void insert(View view) {
    Student student = new Student("姚甜雪", 34);
    dao.insert(student);
}
//TODO:刪除數據
public void delete(View view) {
    dao.deleteById(1);
}
//TODO:修改數據
public void update(View view) {
    Student student = new Student("姚甜雪1號", 78);
    dao.update(student,1);//將id爲1的student修改成
}
//TODO:查詢數據
public void query(View view) {
    //查詢數據
    ArrayList<Student> list = dao.queryAll();
    //創建適配器
    myAdapter=new MyAdapter(Main2Activity.this,list);
    listView.setAdapter(myAdapter);
}

}

六,使用事務批量處理數據

1.什麼是事務?

就是把多件事情當做一件事情來處理。也就是大家同在一條船上,要活一起活,要over一起over !
在Android應用程序開發中,經常會遇到需要進行數據庫操作的時候,有關數據庫事務處理對Android應用程序的穩定性和效率提升非常重要。

2…事務的好處?

1.首先Android數據庫操作,特別是進行寫操作的時候非常慢,將所有操作打包成一個事務能大大提高處理速度。
2.保證數據的一致性,讓一個事務中的所有操作都成功執行,或者失敗,或者所有操作回滾。
例如:應用程序初始化時需要批量插入大量數據,單獨的使用for循環方法導致應用響應緩慢,因爲 sqlite插入數據的時候默認一條語句就是一個事務,有多少條數據就有多少次磁盤操作。我的應用初始5000條記錄也就是要5000次讀寫磁盤操作。
而且不能保證所有數據都能同時插入。(有可能部分插入成功,另外一部分失敗,後續還得刪除。太麻煩)

3.代碼:

SQLiteDatabase db = myHepler.getWritableDatabase();
db.beginTransaction();//開啓事務
try {
for (int i=0;i<1000;i++) {
db.execSQL(“insert into 表名 (字段名) values(值)”);
}
db.setTransactionSuccessful();//成功
}catch (Exception e){
e.printStackTrace();
}finally {
db.endTransaction();//結束事務
db.close();//關閉
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章