码迷,mamicode.com
首页 > 移动开发 > 详细

Android下 SQLite的使用

时间:2015-10-08 18:32:52      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:

今天学习了android下的sqlite 。

知识记录:

1.SQLiteOpenHelper

  SQliteOpenHelper是一个抽象类,来管理数据库的创建和版本的管理。要使用它必须实现它的nCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase, int, int)方法

  onCreate:当数据库第一次被建立的时候被执行,例如创建表,初始化数据等。

  onUpgrade:当数据库需要被更新的时候执行,例如删除久表,创建新表。

第一步:创建一个类继承

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);
    }
}

第二步:创建一个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()}

目的是为了防止权限不够的备用措施

Android下 SQLite的使用

标签:

原文地址:http://my.oschina.net/zaizaiangels/blog/514372

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!