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()); } }}
阅读全文
1 0
- android 原生Sqlite使用总结
- Android原生SQLite的一些使用介绍
- Android-SQLite使用总结
- Android SQLite 使用总结
- Android原生AlertDialog使用总结
- Android中SQLite使用总结
- Android原生Sqlite数据库设计
- iOS 原生SQLite 的使用
- Android SQLite数据库使用的小总结
- 原生VideoView使用总结
- Swift IOS原生SQLite库的使用
- Android原生SQLite操作以及greenDao框架操作SQLite
- android 技术总结 图片优化 sqlite使用 Fragment使用
- ANDROID SQLITE学习总结
- Android SQLite总结
- Android SQLite总结
- Android SQLite总结(一)
- Android SQLite总结(一)
- 如何下载淘宝视频
- .net分页控件webdiyer:aspnetpager与gridview联用
- 开通博客了
- Struts2 result各种转发类型
- 将语句中的单词扣出来,并排序的wordSearch类
- android 原生Sqlite使用总结
- 段错误(核心已存储)
- 10. Regular Expression Matching (dp)
- JDBC连接sql server 2008数据库
- Codeforces 842C
- Android Kotlin TextView跑马灯效果
- 多级指针的应用一(字符串的切割)
- IOS应用如何模糊(blur)图片
- java面试题--已知先序和中序遍历求后序遍历