1. 程式人生 > >Android sqlite聯合主鍵的使用

Android sqlite聯合主鍵的使用

一、問題分析
在操作sqlite資料庫的時候,在測試的時候出現了資料的一個不正常的增加,造成的資料的異常,後來發現是sql語句出現的問題。
分析:每次在上傳資料的時候,可能用的是同一個包名,造成資料插不進去,就會把所有的資料都上傳到伺服器,這樣一來就造成了資料的異常,因為每次上傳,時間是不一樣的,我們可以用時間和包名作為聯合主鍵上傳,這樣就可以解決這個問題了。

sql語句聯合組鍵的使用:
String sql = "CREATE TABLE IF NOT EXISTS ZHANG(" +
    "package_name TEXT," +
    "uploaded_traffic_wifi INTEGER," +
    "uploaded_traffic_cellular INTEGER," +
    "upload_date INTEGER," +
    "PRIMARY KEY(package_name,upload_date)"+
    ")";

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

Cursor 是每行的集合。
使用 moveToFirst() 定位第一行。
你必須知道每一列的名稱。
你必須知道每一列的資料型別。
Cursor 是一個隨機的資料來源。
所有的資料都是通過下標取得。
Cursor 的一些重要方法:

close() 關閉遊標,釋放資源
copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) 在緩衝區中檢索請求的列的文字,將將其儲存
getColumnCount() 返回所有列的總數
getColumnIndex(String columnName) 返回指定列的名稱,如果不存在返回-1
getColumnIndexOrThrow(String columnName) 從零開始返回指定列名稱,如果不存在將丟擲 IllegalArgumentException 異常。
getColumnName(int columnIndex) 從給定的索引返回列名
getColumnNames() 返回一個字串陣列的列名
getCount() 返回Cursor 中的行數
moveToFirst() 移動游標到第一行
moveToLast() 移動游標到最後一行
moveToNext() 移動游標到下一行
上一行註釋:如果我們不知道還沒有其他的元素就用這個,如果知道具體的資料及解析就不用這個
moveToPosition(int position) 移動游標到一個絕對的位置
moveToPrevious() 移動游標到上一行

 - 訪問 Cursor 的下標獲得其中的資料
cursor.moveToLast();
last = cursor.getInt(cursor.getColumnIndex("Id"));
Log.i("nowamagicdb", "last_id=>" + last);

 - 迴圈 Cursor 取出我們需要的資料
if (cursor.getCount() > 0) {
    List<NowaMagic> myList = new ArrayList<NowaMagic>();
    while (cursor.moveToNext()) {
        myList.add(parse(cursor));
    }
    return myList;
}

三、SQLite 約束
約束是在表的資料列上強制執行的規則。這些是用來限制可以插入到表中的資料型別。這確保了資料庫中資料的準確性和可靠性。
約束可以是列級或表級。列級約束僅適用於列,表級約束被應用到整個表。

以下是在 SQLite 中常用的約束。
    NOT NULL 約束:確保某列不能有 NULL 值。
    DEFAULT 約束:當某列沒有指定值時,為該列提供預設值。
    UNIQUE 約束:確保某列中的所有值是不同的。
    PRIMARY Key 約束:唯一標識資料庫表中的各行/記錄。
    CHECK 約束:CHECK 約束確保某列中的所有值滿足一定條件。
  • NOT NULL 約束

預設情況下,列可以儲存 NULL 值。如果您不想某列有 NULL 值,那麼需要在該列上定義此約束,指定在該列上不允許 NULL 值。
與沒有資料是不一樣的,它代表著未知的資料。
例項

例如,下面的 SQLite 語句建立一個新的表 COMPANY,並增加了五列,其中 ID、NAME 和 AGE 三列指定不接受 NULL 值:
CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);
  • DEFAULT 約束

DEFAULT 約束在 INSERT INTO 語句沒有提供一個特定的值時,為列提供一個預設值。
例項

例如,下面的 SQLite 語句建立一個新的表 COMPANY,並增加了五列。在這裡,SALARY 列預設設定為 5000.00。所以當 INSERT INTO 語句沒有為該列提供值時,該列將被設定為 5000.00。
CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL    DEFAULT 50000.00);
  • UNIQUE 約束

例項

例如,下面的 SQLite 語句建立一個新的表 COMPANY,並增加了五列。在這裡,AGE 列設定為 UNIQUE,所以不能有兩個相同年齡的記錄:
CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL UNIQUE,
   ADDRESS        CHAR(50),
   SALARY         REAL    DEFAULT 50000.00);
  • PRIMARY KEY 約束

PRIMARY KEY 約束唯一標識資料庫表中的每個記錄。在一個表中可以有多個 UNIQUE 列,但只能有一個主鍵。在設計資料庫表時,主鍵是很重要的。主鍵是唯一的 ID。
我們使用主鍵來引用表中的行。可通過把主鍵設定為其他表的外來鍵,來建立表之間的關係。由於”長期存在編碼監督”,在 SQLite 中,主鍵可以是 NULL,這是與其他資料庫不同的地方。
主鍵是表中的一個欄位,唯一標識資料庫表中的各行/記錄。主鍵必須包含唯一值。主鍵列不能有 NULL 值。
一個表只能有一個主鍵,它可以由一個或多個欄位組成。當多個欄位作為主鍵,它們被稱為複合鍵。
如果一個表在任何欄位上定義了一個主鍵,那麼在這些欄位上不能有兩個記錄具有相同的值。
例項

已經看到了我們建立以 ID 作為主鍵的 COMAPNY 表的各種例項:
CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);
  • CHECK 約束

CHECK 約束啟用輸入一條記錄要檢查值的條件。如果條件值為 false,則記錄違反了約束,且不能輸入到表。
例項
例如,下面的 SQLite 建立一個新的表 COMPANY,並增加了五列。在這裡,我們為 SALARY 列新增 CHECK,所以工資不能為零:
CREATE TABLE COMPANY3(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL CHECK(SALARY > 0));

  • 刪除約束

SQLite 支援 ALTER TABLE 的有限子集。在 SQLite 中,ALTER TABLE 命令允許使用者重命名錶,或向現有表新增一個新的列。重新命名列,刪除一列,或從一個表中新增或刪除約束都是不可能的。