Android StudioでSQLiteを触ったときのメモ

# はじめに

Android Studio で SQLite を使った時のメモ

# データベースの作成

以下のコードでは、メモアプリのデータベースを作ります。
ノートのタイトルを`Title`,ノートの内容を`Descritption`としてデータベースを作成します。

```Kotlin
class  DbManager{

    val dbName="MyNotes"
    val dbTable="Notes"
    val colID="ID"
    val colTitle="Title"
    val colDes="Description"
    val dbVersion=1
    //データベースがなかったらデータベースを作る
    //CREATE TABLE IF NOT EXISTS MyNotes (ID INTEGER PRIMARY KEY,title TEXT, Description TEXT);"
    val sqlCreateTable="CREATE TABLE IF NOT EXISTS "+ dbTable +" ("+ colID +" INTEGER PRIMARY KEY,"+
            colTitle + " TEXT, "+ colDes +" TEXT);"
    var sqlDB:SQLiteDatabase?=null

    constructor(context:Context){
        //データベースの作成
        var db=DatabaseHelperNotes(context)
        //データベースを書き込みモードにする
        sqlDB=db.writableDatabase
    }

    //
    inner class  DatabaseHelperNotes:SQLiteOpenHelper{
        var context:Context?=null
        constructor(context:Context):super(context,dbName,null,dbVersion){
            this.context=context
        }
        //データベースを最初に作る
        override fun onCreate(position: SQLiteDatabase?) {
            position!!.execSQL(sqlCreateTable)

        }
        //データベースのバージョンが変わったら新しくデータベースを作る
        override fun onUpgrade(position: SQLiteDatabase?, p1: Int, p2: Int) {
            position!!.execSQL("Drop table IF EXISTS " + dbTable)
        }

    }
```

# データベースの操作

## データの挿入

データの挿入には`insert (table,nullColumnHack,values)`を使います。
|引数|オプション|
|:---|:--------|
|table|データを挿入するデータベースを指定する|
|nullColumnHack|よくわかんなかった...|
|values|挿入する値を入れる。キー値と値の二つが必要|

今回は、`class DbManager`の中に、このような関数として実装しました。

```Kotlin
//データベースにデータを挿入する
    fun Insert(values:ContentValues):Long{
        val ID= sqlDB!!.insert(dbTable,null,values)
        //エラーの場合-1が返される
        return ID
    }
```

##　データの探索

`query(sqlDB,projection,selection,selectionArgs,groupBy,having,SorOrder)`の引数には以下のようなオプションを入れます。

| 引数          | オプション                                                                               |
| :------------ | :--------------------------------------------------------------------------------------- |
| sqlDB         | クエリするデータベースの指定                                                             |
| projection    | 返すリストの列を`SQL WHERE`に従って指定する。null を入れるとすべてのデータが返される     |
| selection     | クエリ文を入れる                                                                         |
| selectionArgs | 探したい、文字を入れる。`selection`に`?`がある場合、`?`が`selectionArgs`に置き換えられる |
| groupBy       | `SQL GROUP BY`に従ってグループ化する。`null`の場合にはグループ化されない                 |
| having        | グループ化されたデータからデータを選択する。`null`の場合にはグループは無視される。       |
| SorOrder      | 並び替えの順序を決める。`null`の場合にはそのまま。                                       |

今回は、このような関数として実装しました。

```Kotlin
//第一引数、探したいデータ
    fun Query(projection: Array<String>,selection:String,selectionArgs:Array<String>,SorOrder:String):Cursor {
        val qb = SQLiteQueryBuilder()
        //読み出すデータベースの指定
        qb.tables = dbTable
        val cursor = qb.query(sqlDB,projection,selection,selectionArgs,null,null,SorOrder)
        return cursor
    }
```

## データの削除

データの削除には`delete (table,whereClause,whereArgs)`を使います。

| 引数        | オプション                                          |
| :---------- | :-------------------------------------------------- |
| table       | データベースの選択                                  |
| whereClause | `WHERE`のオプションとなる文を入れる                 |
| whereArgs   | `whereClause`に`?`がある場合の時に`?`に代入される値 |

今回は、このような関数として実装しました。

```Kotlin
    fun Delete(selection: String, selectionArgs: Array<String>){
         val cursor = sqlDB!!.delete(dbTable,selection,selectionArgs)
        return cursor
    }
```

## データの更新

データの更新には`update (table,values,whereClause, whereArgs)`を使います。

| 引数        | オプション                                          |
| :---------- | :-------------------------------------------------- |
| table       | データベースの選択                                  |
| values      | 挿入するデータを代入する                            |
| whereClause | `WHERE`のオプションとなる文を入れる                 |
| whereArgs   | `whereClause`に`?`がある場合の時に`?`に代入される値 |

今回は、このような関数として実装しました。

```Kotlin
fun Update(values:ContentValues,selection: String,selectionArgs: Array<String>):Int{
        val count = sqlDB!!.update(dbTable,values,selection,selectionArgs)
        return count
    }
```

# エラーを吐いた

以下のようなエラーを吐いた時には、一回エミュレーターからアプリをアンインストールしたら解決しました。

```Kotlin
android.database.sqlite.SQLiteException: no such table: Notes
```