Android权威编程指南笔记 第十四章 SQLite数据库

第十四章 SQLite数据库

  • 相关步骤:
  1. 新建类,定义数据表的表名及表头字段。
  2. 定义创建数据库的类
  3. 向数据库中写入数据
  4. 读取数据库中的数据

定义表名及表头字段

public class CrimeDbSchema {
    	public static final class CrimeTable{
       	 public static final String NAME = "crimes";

        	public static final class Cols{
            	public static final String UUID = "uuid";
            	public static final String TITLE = "title";
            	public static final String DATE = "date";
            	public static final String SOLVED = "solved";
    	    }
    	}
	}

定义创建数据库的类

调用该方法,CrimeBaseHelper会做如下工作。

  • 打开数据库,如果不存在则新建一个
  • 如果是首次创建,则调用onCreate方法,然后保存最新版本号。
  • 如果已经创建过,首先检查版本号。然后决定是否升级
  • 该类继承自SQLiteOpenHelper
public class CrimeBaseHelper extends SQLiteOpenHelper {
    private static final String DATEBASE_NAME = "crimeBase.db";
    private static final int VESION = 1;

    public CrimeBaseHelper(Context context) {
        super(context, DATEBASE_NAME, null, VESION); //第二个参数传入要创建数据库的名字,
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(String.format( "create table %s( _id integer primary key autoincrement, %s, %s, %s, %s, %s)",
                CrimeTable.NAME,//引入前面定义的表格名及字段名称,在数据库中创建表格
                CrimeTable.Cols.UUID,
                CrimeTable.Cols.TITLE,
                CrimeTable.Cols.DATE,
                CrimeTable.Cols.SOLVED,
                CrimeTable.Cols.SUSPECT
                )
        );
        /*db.execSQL("create table " + CrimeTable.NAME + "(" +
                " _id integer primary key autoincrement, " +
                CrimeTable.Cols.UUID + "," +
                CrimeTable.Cols.TITLE + ", " +
                CrimeTable.Cols.DATE + ", " +
                CrimeTable.Cols.SOLVED +
                        ")"
        );*/
    }

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

    }
}

向数据库中写入数据

  • 创建数据库对象SQLiteDatabase
        mContext = context.getApplicationContext();
        mDatabase = new CrimeBaseHelper(mContext)
                .getWritableDatabase();
  • 实行写入数据库和更新的辅助类是ContentValues
  1. 他是一种键值对形式的储存类型,其只能用于处理SQLite数据。
  2. 通过将数据的记录转化成ContentValues,在数据的单例中创建该对象实例。
private static ContentValues getContentValues(Crime crime){
        ContentValues values = new ContentValues();
        values.put(CrimeTable.Cols.UUID, crime.getId().toString());
        values.put(CrimeTable.Cols.TITLE, crime.getTitle());
        values.put(CrimeTable.Cols.DATE, crime.getDate().getTime());
        values.put(CrimeTable.Cols.SOLVED, crime.isSolved() ? 1 : 0);

        return values;
    }

  • 插入记录insert(String, String, ContentValues);//第一个参数为表名,第三个是要写入到数据,第二个参数暂时写为null,先不管。。
  • 删除记录delete(String,String,String[]);//表名,列名,列的值(以数组形式给出)
  • 更新记录update(String,String,String[]);
    public void addCrime(Crime c){
        ContentValues values = getContentValues(c);

        mDatabase.insert(CrimeTable.NAME, null, values);
    }

    public void updateCrime(Crime crime){
        String uuidString = crime.getId().toString();
        ContentValues values = getContentValues(crime);

        mDatabase.update(CrimeTable.NAME, values,
                CrimeTable.Cols.UUID + " = ?",
                new String[] { uuidString } );
    }
    
    public void deletCrime(Crime crime){
        String uuidString = crime.getId().toString();

        mDatabase.delete(CrimeTable.NAME,
                CrimeTable.Cols.UUID + " = ? ",
                new String[] {uuidString});
    }


读取数据库中的数据

  • 步骤:
  1. 需创建一个Cursor的封装类CursorWrapper
  2. 使用这个封装类
  • 创建:
public class CrimeCursorWrapper extends CursorWrapper {
    	CrimeCursorWrapper(Cursor cursor) {
        	super(cursor);
    	}

    	public Crime getCrime(){
    	    String uuidString = getString(getColumnIndex(CrimeTable.Cols.UUID));//返回当前列的索引列的字符串值
        	String title = getString(getColumnIndex(CrimeTable.Cols.TITLE));
        	long date = getLong(getColumnIndex(CrimeTable.Cols.DATE));
        	int isSolved = getInt(getColumnIndex(CrimeTable.Cols.SOLVED));

        	Crime crime = new Crime(UUID.fromString(uuidString));				//传入UUID的键,返回
        	crime.setTitle(title);
        	crime.setDate(new Date(date));
        	crime.setSolved(isSolved != 0);

       	 	return crime;
    	}
	}
  • 使用:
    @NonNull
    private CrimeCursorWrapper queryCrimes(String whereClause, String[] whereArgs){
        Cursor cursor = mDatabase.query(
                CrimeTable.NAME,	//表名
                null,//selects all columns
                whereClause,
                whereArgs,
                null,
                null,
                null
        );

        return new CrimeCursorWrapper(cursor);
    }
  1. 返回列表
	public List<Crime> getCrimes() {
        List<Crime> crimes = new ArrayList<>();

        CrimeCursorWrapper cursor = queryCrimes(null, null);

        try {
            cursor.moveToFirst();    //将光标移动到第一行
            while (!cursor.isAfterLast()){      //若不是最后一行
                crimes.add(cursor.getCrime());
                cursor.moveToNext();            //向下移动
            }
        } finally {
            cursor.close();                     //最后记得关闭cursor
        }
        return crimes;
    }

  1. 查询单个列表项
 public Crime getCrime(UUID id) {
        CrimeCursorWrapper cursor = queryCrimes(
                CrimeTable.Cols.UUID + " = ?",
                new String[] {id.toString()}        //查询语句
        );

        try {
            if(cursor.getCount() == 0){
                return null;
            }

            cursor.moveToFirst();
            return cursor.getCrime();
        } finally {
            cursor.close();
        }
    }

相关小记

  • 实践中遵循以下步骤
  1. 确认目标数据库是否存在
  2. 如果不存在,首先创建数据库,然后创建数据表并初始化数据。
  3. 如果存在。打开并确认是否为最新版本
  4. 若为旧版本,就先升级到最新版本
  • 若更新的版本内容较少,可通过直接卸载程序达到清除数据库的目的。
  • 在fragment实例通过在onPause()方法中更新数据。

挑战练习

  • 使用数据库实现删除功能
case R.id.delet_crime:
                CrimeLab.get(getActivity()).deletCrime(mCrime);
                getActivity().finish();
                return true;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值