SQLiteDatabases使用

SQLite是android提供的內置的一個輕量級別的數據庫。使用SQLite的應用程序都有一個該數據庫的實例,一般情況下數據儲存在androidSD卡的 /data/data/<packagename>/databases 文件夾中。

使用SQLite的步驟:

創建數據庫

打開數據庫

創建表

完成數據庫的(增刪改查)

關閉數據庫

下面都是根據谷歌封裝好的方法來進行的表的增刪改查

使用谷歌封裝好的方法操作數據庫的利弊:

利: 1.寫法簡單,不需要寫複雜的SQL語句,也就不容易出錯

        2.有返回值,方便開發者進行開發

弊:不容易進行多表查詢

使用SQL語句操作數據庫的利弊:

利:容易多表查詢

弊:1.SQL語句容易寫錯

       2.執行SQL語句沒有返回值,不容易進行判斷

1. 繼承SQLiteOpenHelper
public MySqliteOpenHelper(Context context) {
super(context, DB_NAME, null, VERTION);
//創建了一個數據庫
}
@Override
public void onCreate(SQLiteDatabase db) {
//在onCreate中創建我們所有的表
db.execSQL(CRETAE_TABLE_USER);
}

@Override
13. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVer
sion) {
14. //數據庫版本更新的時候
15. //刪除舊的表,建立新的表
16. }
17.
18. 2. 獲取數據庫
19. MySqliteOpenHelper helper = new MySqliteOpenHelper(this);
20. //helper.getWritableDatabase() //當磁盤滿了,就會報錯
21. //helper.getReadableDatabase() //當磁盤滿了,不進行操作了
22.
23. 3. 增刪查改
24. //成功返回插入的id號,失敗返回-1
25. db.insert(TABLE_NAME, null, contentValues(鍵值對來保存數據庫的鍵名=值));
26. //成功返回受影響的行數,失敗返回-1
27. db.update(TABLE_NAME, 修改的數據contentValues, "條件 使用?來佔位", new Str
ing[]{對應?佔位符});
28. db.query(TABLE_NAME, null, null, null, null, null, null);//全部查詢
29. //選擇性查詢
30. db.query(TABLE_NAME, new String[]{查詢的列}, "條件?", new String[]{對應?
}, null, null, null);
31.
32. //成功返回受影響的行數,失敗返回-1
33. db.delete(TABLE_NAME,"條件",new String[]{對應?};
34.
35.
36.
37. 查詢語句返回的是Cursor
38.
39. while(cursor.moveToNext()) //遍歷所有的數據


SQLiteOpenHelper是android提供給我們的一個數據庫輔助類(抽象的)用來創建和打開數據庫的。我們要自己寫一個類來繼承它。在該類的構造器中,調用Context中的方法創建並打開一個指定名稱的數據庫對象。繼承和擴展SQLiteOpenHelper類主要做的工作就是重寫以下兩個方法。

1. onCreate(SQLiteDatabase db) :當數據庫被首次創建時執行該方法,一般將創建表等初始化操作在該方法中執行。
2. onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):當打開數據庫時傳入的版本號與當前的版本號不同時會調用該方法。

除了上述兩個必須要實現的方法外,還可以選擇性地實現onOpen 方法,該方法會在每次打開數據庫時被調用。

SQLiteOpenHelper 類的基本用法是:當需要創建或打開一個數據庫並獲得數據庫對象時,首先根據指定的文件名創建一個輔助對象,然後調用該對象的getWritableDatabase 或
getReadableDatabase方法 獲得SQLiteDatabase 對象。

調用getReadableDatabase 方法返回的並不總是隻讀數據庫對象,一般來說該方法和getWriteableDatabase 方法的返回情況相同,只有在數據庫僅開放只讀權限或磁盤已滿時纔會返回一個只讀的數據庫對象。一般都會用getReadableDatabase


關於 Cursor

在你理解和使用 Android Cursor 的時候你必須先知道關於 Cursor 的幾件事情:

Cursor 是每行的集合。
使用 moveToFirst() 定位第一行。
你必須知道每一列的名稱。
你必須知道每一列的數據類型。

Cursor 是一個隨機的數據源。
所有的數據都是通過下標取得


關於 Cursor 的重要方法:

方法: close()
解釋: 關閉遊標,釋放資源

方法: copyStringToBuffer(int columnIndex,CharArrayBufferbuffer)
解釋: 在緩衝區中檢索請求的列的文本,將將其存儲

方法: getColumnCount()
解釋: 返回所有列的總數

方法: getColumnIndex(StringcolumnName)
解釋: 返回指定列的名稱,如果不存在返回-1

方法: getColumnIndexOrThrow(StringcolumnName)
解釋: 從零開始返回指定列名稱,如果不存在將拋出IllegalArgumentException異常。

方法: getColumnName(int columnIndex)
解釋: 從給定的索引返回列名

方法: getColumnNames()
解釋: 返回一個字符串數組的列名

方法: getCount()
解釋: 返回Cursor 中的行數

方法: moveToFirst()
解釋: 移動光標到第一行

方法: moveToLast()
解釋: 移動光標到最後一行

方法: moveToNext()
解釋: 移動光標到下一行

方法: moveToPosition(int position)
解釋: 移動光標到一個絕對的位置

方法: moveToPrevious()
解釋: 移動光標到上一行


例子:

package com.example.lesson_sqlitedatabase;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MySqliteOpenHelper helper = new MySqliteOpenHelper(this);
/*        helper.getWritableDatabase()  當磁盤滿了,就會報錯
        helper.getReadableDatabase() 當磁盤滿了,不進行操作了,這兩個方法都可以讀寫,所以一般都會用這個方法*/
        // 打開數據庫,去創建
        SQLiteDatabase sqld = helper.getReadableDatabase();
        // 傳值到user對象
        User user = new User("張三", "123456789");
        ContentValues values = new ContentValues();
        // 添加到數據庫(鍵值對)
        values.put(MySqliteOpenHelper.USERNAME, user.getUsername());
        values.put(MySqliteOpenHelper.PASSWORD, user.getPassword());
        // 存儲數據
        sqld.insert(MySqliteOpenHelper.TABLE_NAME, null, values);

        // 修改數據
        ContentValues values1 = new ContentValues();
        // 鍵值
        values1.put("username", "李四");
        values1.put("password", "987654321");
        // 修改後更新數據
        sqld.update(MySqliteOpenHelper.TABLE_NAME, values1, "ID=? and username=?", new String[]{"2", "張三"});

        // 查詢
        Cursor cursor = sqld.query(MySqliteOpenHelper.TABLE_NAME, null, null, null, null, null, null);
        List<User> userList = new ArrayList<>();
        // 有數據就會進入while循環取讀取數據,沒有就會斷開不進入
        while (cursor.moveToNext()) {
            long id = cursor.getLong(cursor.getColumnIndex(MySqliteOpenHelper.ID));
            String username = cursor.getString(cursor.getColumnIndex(MySqliteOpenHelper.USERNAME));
            String password = cursor.getString(cursor.getColumnIndex(MySqliteOpenHelper.PASSWORD));
            User u = new User(username, password);
            u.setId(id);
            // 把所有的數據添加到userList中
            userList.add(u);
        }
        cursor.close();
        Log.e("TAG", "------------------" + userList.toString());
        Collections.sort(userList, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                return o1.getUsername().compareTo(o2.getUsername());
            }
        });

        // 刪除
        sqld.delete(MySqliteOpenHelper.TABLE_NAME, "username=?", new String[]{"張三"});
    }
}
package com.example.lesson_sqlitedatabase;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by Administrator on 2017/3/29 0029.
 */

public class MySqliteOpenHelper extends SQLiteOpenHelper {
    // 數據庫的名稱
    public static final String DB_NAME = "user.db";
    public static final int VERSION = 1;

    //表名
    public static final String TABLE_NAME = "user";

    //列名
    public static final String ID = "ID";
    public static final String USERNAME = "username";
    public static final String PASSWORD = "password";

    // CREATE_TABLE_USER 後面的是創建表的輸入語句
    public static final String CREATE_TABLE_USER =  "create table " + TABLE_NAME + " (" + ID + " integer primary key autoincrement," + USERNAME + " varchar(20) not null," + PASSWORD + " varchar(20) not null)";

    public MySqliteOpenHelper(Context context) {
        super(context, DB_NAME, null, VERSION);
        // 創建一個數據庫
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 創建表都是到onCreate中創建
        db.execSQL(CREATE_TABLE_USER);
    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 數據庫版本更新的時候
        // 刪除舊的表,建立新的表
    }
}

package com.example.lesson_sqlitedatabase;

/**
 * Created by Administrator on 2017/3/29 0029.
 */

public class User {
    long id;
    String username;
    String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}



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