Android下SQLiteの使用

8581 ワード

今日はandroidの下のsqliteを勉強しました.
知識記録:
1.SQLiteOpenHelper
SQliteOpenHelperは、データベースの作成とバージョンの管理を管理する抽象クラスです.使用するには、nCreate(SQLiteDatabase)、onUpgrade(SQLiteDatabase、int、int)メソッドを実装する必要があります.
onCreate:データベースが最初に確立されたときに実行されます.たとえば、テーブルの作成、データの初期化などです.
onUpgrade:データベースを更新する必要がある場合に実行します.たとえば、長いテーブルを削除したり、新しいテーブルを作成したりします.
ステップ1:クラス継承の作成
SQLiteOpenHelper

コードは次のとおりです.
package com.zaizai.sqlite;

import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * Created by AnJie on 2015/10/8.
 */
public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {

    private static final String databases_name = "mydatabase.db";
    private static final String databases_table = "person";
    private static final int databases_version = 1;
    private static final String KEY_ID = "_id";
    /*       */
    private static final String databases_create = "create table person ( _id integer primary key autoincrement,name varchar(20),age integer);";

    /**
     *         
     * @param context
     *
     * name      
     * factory     
     * version              1
     */
    public PersonSQLiteOpenHelper(Context context) {
        super(context, databases_name, null, 5);
    }
    /**
     * @param context      
     * @param name         
     * @param factory
     * @param version
     */
    public PersonSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public PersonSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
        super(context, name, factory, version, errorHandler);
    }

    /**
     *               .
     *       
     *    :
     * create table person(
     * _id integer primary key,
     * name varchar(20),
     * age integer
     * );
     */

    @Override
    public void onCreate(SQLiteDatabase db) {
        /*          ,                */

        db.execSQL(databases_create);

    }

    /**
     *                ,
     *         (   ,    ,    )
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        Log.w("TaskDBAdapter", "upgrading from version" + oldVersion + "To" + newVersion + ",which will destroy all old data");
       /*    */
        db.execSQL("DROP TABLE IF EXISTS "+databases_table);
        /*    */
        onCreate(db);
    }
}

ステップ2:daoクラスを作成する

        package com.zaizai.sqlite.dao;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.zaizai.sqlite.PersonSQLiteOpenHelper;
import com.zaizai.sqlite.damin.Person;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by AnJie on 2015/10/8.
 */
public class PersonDao {
    private static final String TAG = "PersonDao";
    private PersonSQLiteOpenHelper myOpenHelper = null;

    public PersonDao(Context context) {
        this.myOpenHelper = new PersonSQLiteOpenHelper(context);
    }

    public void inset(Person person) {
        /**/
        SQLiteDatabase db = null;
        try {
            db = myOpenHelper.getWritableDatabase();
        } catch (Exception e) {
            e.printStackTrace();
            db = myOpenHelper.getReadableDatabase();
        }
        /**/

        if (db.isOpen()) {    //        ,        

            ContentValues values = new ContentValues();
            values.put("name", person.getName());        // key        , value     
            values.put("age", person.getAge());
            /* value null ,           Null SQLite      null*/
            long id = db.insert("person", "name", values);
            Log.i(TAG, "id: " + id);
            
            db.close();    //      
        }

    }

    /**
     *   id    
     *
     * @param id
     */
    public void delete(int id) {
        SQLiteDatabase db = null;
        try {
            db = myOpenHelper.getWritableDatabase();
        } catch (Exception e) {
            e.printStackTrace();
            db = myOpenHelper.getReadableDatabase();
        }
        if (db.isOpen()) {    //        ,        

            String whereClause = "_id = ?";
            String[] whereArgs = {id + ""};
            int count = db.delete("person", whereClause, whereArgs);
            Log.i(TAG, "   : " + count + " ");
            db.close();    //      
        }
    }


    /**
     *   id    ,       
     *
     * @param id
     * @param name
     */
    public void update(int id, String name) {
        SQLiteDatabase db = null;
        try {
            db = myOpenHelper.getWritableDatabase();
        } catch (Exception e) {
            e.printStackTrace();
            db = myOpenHelper.getReadableDatabase();
        }
        if (db.isOpen()) {    //        ,        
            ContentValues values = new ContentValues();
            values.put("name", name);

            int count = db.update("person", values, "_id = ?", new String[]{id + ""});

            Log.i(TAG, "   : " + count + " ");

            db.close();    //      
        }
    }

    public List<Person> queryAll() {
        SQLiteDatabase db = null;
        try {
            db = myOpenHelper.getWritableDatabase();
        } catch (Exception e) {
            e.printStackTrace();
            db = myOpenHelper.getReadableDatabase();
        }
        if (db.isOpen()) {
            String[] columns = {"_id", "name", "age"};    //     
            String selection = null;    //     ,  null    
            String[] selectionArgs = null;    //        ,         ?         
            String groupBy = null;    //       group by name
            String having = null;    //     
            String orderBy = null;    //   

            Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);

            int id;
            String name;
            int age;
            if (cursor != null && cursor.getCount() > 0) {
                List<Person> personList = new ArrayList<Person>();

                while (cursor.moveToNext()) {    //      ,       ,         ,   .
                    id = cursor.getInt(0);
                    name = cursor.getString(1);
                    age = cursor.getInt(2);

                    personList.add(new Person(id, name, age));
                }

                db.close();
                return personList;
            }
            db.close();
        }
        return null;
    }

    /**
     *   id   
     *
     * @param id
     * @return
     */
    public Person queryItem(int id) {
        SQLiteDatabase db = null;
        try {
            db = myOpenHelper.getWritableDatabase();
        } catch (Exception e) {
            e.printStackTrace();
            db = myOpenHelper.getReadableDatabase();
        }
        if (db.isOpen()) {
            String[] columns = {"_id", "name", "age"};    //     
            String selection = "_id = ?";    //     ,  null    
            String[] selectionArgs = {id + ""};    //        ,         ?         
            String groupBy = null;    //       group by name
            String having = null;    //     
            String orderBy = null;    //   

            Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);

            if (cursor != null && cursor.moveToFirst()) {        // cursor    null,           
                int _id = cursor.getInt(0);
                String name = cursor.getString(1);
                int age = cursor.getInt(2);

                db.close();
                return new Person(_id, name, age);
            }
            db.close();
        }
        return null;
    }


}

中は原生のsql文で操作することができて、apiを通じて(通って)、私のここの使うのはapiです
db = {
            db = .getWritableDatabase()} (e) {
            e.printStackTrace()db = .getReadableDatabase()}

権限不足を防ぐための代替措置を目的としています