android 原生Sqlite使用总结

来源:互联网 发布:淘宝夏宽 编辑:程序博客网 时间:2024/05/28 15:49

Dear All,大家好,今天给大家展示一下如何使用android自带的sqlite,纯sql语句:

首先,我们需要新建一个SqliteOpenHelper这样一个工具类来执行建表和版本升级的操作,继承自DBOpenHelper

/** * Created by Zac on 2017/8/29. * 自定义的数据库帮助类, */public class DBOpenHelper extends SQLiteOpenHelper{    public DBOpenHelper(Context context,                        String name,                        SQLiteDatabase.CursorFactory factory,                        int version) {        super(context, name, factory, version);    }    //当数据库被创建时调用    @Override    public void onCreate(SQLiteDatabase db) {        //执行创建表的语句        String createSql = "CREATE TABLE \"Student\" \n" +                " ( _id INTEGER PRIMARY KEY AUTOINCREMENT,\n" +                "name NVARCHAR(10), \n" +                "gender INT,age INT CHECK(age >= 18),\n" +                "course NVARCHAR(20));";        db.execSQL(createSql);    }    /**     * @param db      * @param oldVersion :数据库旧的版本号     * @param newVersion :数据新的版本号     */    //执行数据库的更新    @Override    public void onUpgrade(SQLiteDatabase db,                          int oldVersion,                          int newVersion) {        //执行数据更新的代码    }}
我们新建了一个Student表,里面包含自增id,name,gender和course四个属性。现在我们要和数据库交互,还需要新建一个执行删改查的
DaoStudent,都展示在下面了,这个工具类采用单例模式,具体的方法见下:
/** * Created by Zac on 2017/8/29. * 和数据库交互的接口层,和interface不是一个概念 * 这个类需要是一个单例的 */public class DaoStudent {    /**     * Log使用的tag     */    private final String mTag = this.getClass().getName();    /**     * 数据库的实例     */    private SQLiteDatabase mDb;    //私有的构造函数    private DaoStudent() {    }    /**     * 使用静态内部类来实现单例     */    private static class SingletonHolder {        private static DaoStudent mDao = new DaoStudent();    }    /**     * 获取当前类的实例     *     * @return     */    public static DaoStudent instance() {        return SingletonHolder.mDao;    }    /**     * 初始化DaoStudent     *     * @param context     */    public void init(Context context) {        String userName = PreManager.instance().getUserName();        if (!TextUtils.isEmpty(userName)) {            DBOpenHelper helper =                    new DBOpenHelper(context, userName, null, 1);            //打开数据库或者创建数据库//            SQLiteDatabase.openOrCreateDatabase();            mDb = helper.getReadableDatabase();        } else {            Log.i("DaoStudent", "userName is Empty !!!");        }    }    /**     * 插入数据     *     * @param who : 插入的学生     * @return :true 成功,false失败     */    public boolean insert(Student who) {        //该sql语句的意思是: 有则更新原有的数据,没有则插入新的数据        String insertSql = "INSERT OR REPLACE INTO Student (_id,name,gender,course)\n" +                "  VALUES(?,?,?,?)";        //getReadableDatabase()方法在失败后会去调用getWritableDatabase()        //getWritableDatabase()失败后就结束了//        SQLiteDatabase db2 = getWritableDatabase();        Object[] values = {who.getId(), who.getName(), who.getGender(), who.getCourseId()};        boolean result;        try {            if (mDb != null) { //非空判断,执行插入语句                mDb.execSQL(insertSql, values);            }            result = true;        } catch (SQLException e) {            Log.e(mTag, "insert error !!!" + e.getMessage());            result = false;        }        return result;    }    /**     * 删除数据     *     * @return : 成功 true,否则false     */    public boolean delete(String id) {        String deleteSql = "DELETE FROM Student WHERE _id = ?";        //db 提供的删除的方法        if (mDb == null) {            Log.e(mTag, "mDb is null !!!");            return false;        }//        mDb.delete("Student", "_id=? AND name=?", new String[]{"s13", "张三"});        boolean result;        try {            //建议使用该语句,锻炼Sql语法            mDb.execSQL(deleteSql, new Object[]{id});            result = true;        } catch (SQLException e) {            e.printStackTrace();            result = false;        }        return result;    }    /**     * 更新数据     *     * @param who :被更新的学生     * @return :true 更新成功,false 失败     */    public boolean update(Student who) {        if (mDb == null) {            return false;        }        String updateSql = "UPDATE TABLE Student SET _id= ? WHERE name = ?";        boolean result;        try {            mDb.execSQL(updateSql, new Object[]{who.getId(), who.getName()});            result = true;        } catch (SQLException e) {            Log.e(mTag, "update Error !!!" + e.getMessage());            result = false;        }        return result;    }    /**     * 查询一个学生     *     * @param name     */    public Student loadOne(String name) {        if (mDb == null) {            return null;        }        String sql = "SELECT * FROM Student WHERE name = ?";        Student student = null;        Cursor cursor = null;        try {            cursor = mDb.rawQuery(sql, new String[]{name});            student = null;            int index = 0;            //判断cursor不是null,并且可以移动到第一条数据            if (cursor != null && cursor.moveToFirst()) {                //把cursor移动到第一条数据                student = new Student();                String realId = cursor.getString(index);                student.setId(realId);                student.setName(cursor.getString(index + 1));                student.setGender(cursor.getInt(index + 2));                student.setCourseId(cursor.getString(index + 3));            }        } catch (Exception e) {            e.printStackTrace();            Log.e(mTag, e.getMessage());        } finally {            if (cursor != null) {                cursor.close();            }        }        return student;    }    /**     * 查询整个表的数据     *     * @return :返回数据的集合     */    public List<Student> queryAll() {        if (mDb == null) {            Log.e(mTag, "queryAll mDb is null !!!");            return null;        }        Cursor cursor = null;        List<Student> students = null;        try {            cursor = mDb.rawQuery("SELECT * FROM Student", new String[]{});            if (cursor != null) { //非null判断                students = new ArrayList<>();                int index = 0;                //如果cursor可以移动到下一条数据                while (cursor.moveToNext()) {                    Student one = new Student();                    one.setId(cursor.getString(index));                    one.setName(cursor.getString(index + 1));                    one.setGender(cursor.getInt(index + 2));                    one.setCourseId(cursor.getString(index + 3));                    students.add(one);                }            }        } catch (Exception e) {            Log.e(mTag, "queryAll Error !!! " + e.getMessage());        } finally {            if (cursor != null) {                cursor.close();            }        }        return students;    }    /**插入多条数据     * @param students     * @return     */    public boolean insertAll(List<Student> students) {        if (mDb == null) {            Log.e(mTag, "insertAll error !!!");            return false;        }        boolean result;        mDb.beginTransaction();        try {            for (Student stu : students) {                Object[] args = {stu.getId(), stu.getName(), stu.getGender(), stu.getCourseId()};                mDb.execSQL("INSERT OR REPLACE INTO Student (_id,name,gender,course_id) VALUES (?,?,?,?);", args);            }            //设置事物操作成功            mDb.setTransactionSuccessful();            result = true;        } catch (SQLException e) {            Log.e(mTag, "insertAll Error !!! " + e.getMessage());            result = false;        } finally {            if (mDb != null) {                //结束事物                mDb.endTransaction();            }        }        return result;    }}

这个类是需要在使用的地方init的,最好是放在你定义的application里,但是我是放在使用的地方初始化。。
另外还需要一个PrefrenceManager来保存用户名,我这里也不贴出来了,最后贴上如何使用这个DaoStudent:
public class TestDbActivity extends AppCompatActivity {    private TextView mStudentIdTv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_test_db);        PreManager.instance().saveName("zac");        DaoStudent.instance().init(this);        initView();        setListener();        setData();    }    private void initView() {        mStudentIdTv = (TextView) findViewById(R.id.stu_id);
//插入一条数据        DaoStudent.instance().insert(new Student("testName",22,"testCourseId"));    }    private void setListener() {    }    private void setData() {//执行查询操作,根据name属性        Student student = DaoStudent.instance().loadOne("testName");        if (student != null) {            mStudentIdTv.setText(student.getName());        }    }}



原创粉丝点击