Android中SQLite数据库存储
2016-03-21 12:57
375 查看
为啥要用SQLite存储
如果不使用存储,重启手机会导致数据丢失,这就是临时数据,当时数据保存在内存中,关机之后内存释放,数据丢失。如果不想数据丢失,需要使用数据持久化技术。常见的有SharePreference、数据库存储、SD卡存储、IO流。这里我只说用数据库存储,SharePerference虽说好用,但是不适合存储一些数据量比较大的数据。像这种”累活”还是交给数据库比较好SQLite数据库有啥特点
这里我只想说,如果你玩过服务端,对于数据库中的SQL语句一定是了如指掌,使用的游刃有余。Android中的数据库也支持标准的SQL语句。不过Android数据库向服务端的那种数据库比起来就显得格外的轻量级了,你也不需要安装数据库软件。Android中SQLite数据库的使用
因为操作数据库肯定是要读取和写入的,所以要配置一下读写权限<!--手机中写入数据的权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <!--手机中创建/删除文件的权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
数据库的创建删除以及更新的助手类
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * 数据库建库建表类 * @author LiLei */ public class MySQLiteOpenHelper extends SQLiteOpenHelper { // 数据库名称 public static final String DBNAME = "android.db"; // 数据库版本 public static final int VERSION = 2; // 建表语句,大小写不敏感(只要你大小写不混着写,就不算过分...) private static final String CREATETABLE = "create table " + Message.TABLE_NAME +"(" + "id string," + "title string," + "url string" +")"; /** * 通过构造函数创建数据库 * context 上下文 * DNNAME 数据库的名称 * null 游标 * VERSION 版本 */ public MySQLiteOpenHelper(Context context) { super(context, DBNAME, null, VERSION); } // 创建表 @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATETABLE); } // 更新表 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { this.deleteDB(db); this.onCreate(db); } // 删除表 private void deleteDB(SQLiteDatabase db) { db.execSQL("drop table if exists " + Message.TABLE_NAME); } }
还需要创建一个实体类,用于方便管理数据和集合的操作
这代码就不写了,自己弄一下吧
public static final String TABLENAME = private int id private String private String get 和 set 方法
数据库和表都有了,还需要对表增删改查的功能,所以还要创建一个类,对其操作
/** * 数据库管理类(CRUD) * @author LiLei */ public class DatabaseManager { private MySQLiteOpenHelper dbHelper; public DatabaseManager() { //这里利用MyApplication类获取MySQLiteOpenHelper对象,下面是MyApplication的代码,别忘了在在AndroidManifest配置一下name /* private static MySQLiteOpenHelper helper; @Override public void onCreate() { super.onCreate(); helper = new MySQLiteOpenHelper(MyApplication.this); } public static MySQLiteOpenHelper getSQLiteOpenHelper() { return helper; } */ dbHelper = MyApplication.getHelper(); } /** * 增 * @param m * @return */ public int insert(Message m) { SQLiteDatabase db = dbHelper.getWritableDatabase(); db.beginTransaction(); try { db.execSQL("insert into " + m.TABLE_NAME + " values(?,?,?)", new Object[] { m.id,m.title,m.url}); db.setTransactionSuccessful(); } catch (Exception e) { return 0; } finally { db.endTransaction(); } db.close(); return 1; } /** * 删 * @param m * @return */ public int delete(Message m) { SQLiteDatabase db = dbHelper.getWritableDatabase(); db.beginTransaction(); try { db.execSQL("delete from " + m.TABLE_NAME + " where id = ?",new Object[] { m.id}); db.setTransactionSuccessful(); } catch (Exception e) { return 0; } finally { db.endTransaction(); } db.close(); return 1; } /** * 改 * @param m * @return */ public int update(Message m) { SQLiteDatabase db = dbHelper.getWritableDatabase(); db.beginTransaction(); try { db.execSQL("update " + m.TABLE_NAME + " set title=?, url=? where id=?", new Object[] { m.title, m.url, m.id }); db.setTransactionSuccessful(); } catch (Exception e) { return 0; } finally { db.endTransaction(); } db.close(); return 1; } /** * 查 * 如果不传递参数,代表查询所有 * 传递参数,代表查询表中得ID等于当前ID的数据,没查到就返回null * * @param url 这里的url就是ID,如果你看不惯你就改一下吧! * @return */ public ArrayList<Message> query(String url) { SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor; Message message; ArrayList<Message> list = new ArrayList<Message>(); // 若url为null或""则返回所有数据 if (url == null || url.equals("")) { cursor = db.rawQuery("select * from " + Message.TABLE_NAME, null); } else { cursor = db.rawQuery("select * from " + Message.TABLE_NAME + " where url=?", new String[] { url }); } while (cursor.moveToNext()) { message = new Message(); message.id = cursor.getInt(cursor.getColumnIndex("id")); message.title = cursor.getString(cursor.getColumnIndex("title")); message.url = cursor.getString(cursor.getColumnIndex("url")); list.add(message); } cursor.close(); db.close(); if (list.size() == 0) { return null; } return list; } }
这三个类都写完了,直接就可以用了
用的话也是很简单了,直接在MainActivity中
//创建数据库和获取数据库管理对象 DatabaseManager databaseManager = new DatabaseManager(); //增 删 改 查 databaseManager.insert(JavaBean对象); //查询 List<JavaBean对象> messageList = databaseManager.query(传ID或者不传递);
SQLite数据库使用是非常easy的。不过Android考虑的非常周全,就怕你不会SQL语句,也为你封装了一下,使用更简便。你用的话随意,用哪种
都可以,我还是比较喜欢直接用SQL写
//增 ContentValues values = new ContentValues(); values.put( "username",username); values.put( "password",password); db.insert( "login", "username" , values); //删 db.delete( "login", "username=?" ,new String[]{"wangcai"}); //改 ContentValues values2 = new ContentValues(); values2.put( "password", "123" ); db.update( "login", values, "username=?" ,new String[]{username}); //查 Cursor cursor = db.query( "login", new String[]{"username", "password"}, "username=?", new String[]{username}, null, null, null); if(cursor.moveToFirst()) { do { String userName = cursor.getString(0); String passWord = cursor.getColumnName(cursor.getColumnIndex( "password")); } while(cursor.moveToNext()); }
这东西就是一点技术含量都没有,看一遍就会了。剩下的就是开发中的实际应用了,还有很多函数这里没有用到,要是感兴趣的话可以到处逛逛。
相关文章推荐
- Android开发笔记(八十三)多语言支持
- Android+FFmpeg+OpenSL ES音频解码播放
- Android+FFmpeg+ANativeWindow视频解码播放
- Android内存信息:VSS、RSS、PSS、USS
- Android可以纵向滚动的textView
- Android Studio中集成fresco,解决冲突的问题。
- Android Studio:Error:(23, 17) Failed to resolve: junit:junit:4.12
- Unsupported major.minor version 52.0
- Android Studio设置自动编译工程
- 怎样查看android SDK文档
- Android笔记——Activity生命周期与数据传递
- 编译vlc android arm64-v8a
- Span 介绍及使用(二)
- Span 介绍及使用(一)
- Android基于Facebook Rebound的动画效果框架Backboard demo (非常炫酷)
- Android静默安装和静默卸载
- Android实现音乐示波器、均衡器、重低音和音场功能
- android:process 讲解
- Android性能测试:CPU内存监控工具APT
- Android 引导页动态加载(多页面 ViewPager联动RadioButton)