大家好,前几天我写了一篇关于ormlite数据库的使用方法,对于数据库的使用是很方便,搭建起来也非常简单,因为底层的关于数据库的SQL语言都已经封装成了方法,所以对于规避错误与使用都是很便捷,但是对于刚开始接触数据库的同学们来说,没有弄清楚原理直接就使用,对于接受方面显然是弊大于利的,所以今天我就带着大家一起在不使用第三方jar包的情况下直接搭建一个数据库并封装一个操作数据库的类,让大家从基础了解安卓数据库的构成与使用。好的,下面就进入正题。
我就简单的搭建一个存放新闻(News)的数据库,新闻属性类我想大家应该都会建(就是定义几个属性和有参构造,无参构造外加get与set方法),我就在这不浪费篇幅了,大家在搭建数据库之前就先写好这个属性类,搭建好之后就跟着我进入下面的步骤吧:
第一步:新建一个java类并继承SQLiteOpenHelper
1、在这个类中,我们要声明数据库的名称以及数据库的版本号
1 private static final String DB_NAME = "NEWS.DB";//数据库名称 2 private static final int DB_VERSION = 1;//数据库版本号
2、我们还要利用java的方法重载定义三个有参构造并重写创建数据库表的onCreate方法
1 public NewsSQLiteOpenHelper(Context context){ 2 super(context,DB_NAME,null,DB_VERSION); 3 } 4 //version 数据库版本号 context 上下文 name数据库名字 5 public NewsSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { 6 super(context, name, factory, version); 7 } 8 public NewsSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) { 9 super(context, name, factory, version, errorHandler); 10 } 11 @Override 12 public void **onCreate**(SQLiteDatabase db) { 13 //获取创建表格的SQL 14 String netNewsSQL =Constant.NewNewsTable.getCreatNetNewsSQL(); 15 //Z执行SQL 16 db.execSQL(netNewsSQL); 17 }
3、重写父类的更新数据库方法
1 @Override 2 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 3 db.execSQL("drop table "+ Constant.NewNewsTable.TBL_NAME); 4 onCreate(db); 5 }
至此我们数据库就算搭建的差不多了,下一步就是创建表了。
第二步:创建表,在搭建好数据库后就是往数据库中添加一张张的表,主要是使用数据库语言定义一个静态生成方法
一定要注意的是在写数据库语言生成的时候字母的大小写以及单词与单词之间的空格(这也是数据库搭建中最最最容易出错的地方,所以大家在写的时候一定要注意),代码如下:
1 public static final class NewNewsTable { 2 public static final String TBL_NAME = "NETNEWS"; 3 public static final String COL_ID = "ID"; 4 public static final String COL_TITLE = "TITLE"; 5 public static final String COL_CTIME = "CTIME"; 6 public static final String COL_PICURL = "PICURL"; 7 public static final String COL_URL = "URL"; 8 public static final String COL_DESCRIPTION = "DESCRIPTION"; 9 public static final String COL_NEWSTYPE = "NEWSTYPE"; 10 11 public static String getCreatNetNewsSQL() { 12 String sql = "CREATE TABLE IF NOT EXISTS " 13 + TBL_NAME + "(" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 14 + COL_TITLE + " VARCHAR(200)," 15 + COL_CTIME + " VARCHAR(50)," 16 + COL_PICURL + " VARCHAR(200)," 17 + COL_URL + " VARCHAR(200)," 18 + COL_DESCRIPTION + " TEXT," 19 + COL_NEWSTYPE + " integer" 20 + ")"; 21 return sql; 22 } 23 }
那么数据库与属性类都完成之后,我们就要提供一个操作类用来操作数据库了,所以最后一步就是定义一个操作类。
第三步:创建一个操作类,为操作数据库提供增删改查等功能
下面为了能够便于大家的理解,我先把这几个功能分开写:
1、将一条数据写入数据库的方法与将一组数据写入数据库的方法:
添加一条:
1 public long addNetNews(NetNews nn){ 2 SQLiteDatabase db = this.openHelper.getReadableDatabase(); 3 ContentValues values = new ContentValues(); 4 values.put(Constant.NewNewsTable.COL_TITLE,nn.getTitle()); 5 values.put(Constant.NewNewsTable.COL_DESCRIPTION,nn.getDescription()); 6 values.put(Constant.NewNewsTable.COL_CTIME,nn.getCtime()); 7 values.put(Constant.NewNewsTable.COL_PICURL,nn.getPicUrl()); 8 values.put(Constant.NewNewsTable.COL_URL,nn.getPicUrl()); 9 values.put(Constant.NewNewsTable.COL_NEWSTYPE, nn.getNewsType()); 10 long id = db.insert( 11 Constant.NewNewsTable.TBL_NAME, 12 null, 13 values 14 ); 15 db.close(); 16 return id; 17 }
添加一组数据(就是利用for循环执行添加一条数据的方法)
1 public void addNetNews(List<NetNews> netNewsList){ 2 for(NetNews nn:netNewsList){ 3 addNetNews(nn); 4 } 5 }
2、根据新闻类型删除数据库中的数据
1 public void removeNewsByType(int type){ 2 SQLiteDatabase DB = this.openHelper.getReadableDatabase(); 3 //根据新闻类型删除 4 DB.delete( 5 Constant.NewNewsTable.TBL_NAME, 6 Constant.NewNewsTable.COL_NEWSTYPE+" =?", 7 new String[]{type+""} 8 ); 9 DB.close(); 10 }
3、根据数据类型查询数据
1 public List<NetNews> findNewsByType(int type){ 2 List<NetNews> list = new ArrayList<>(); 3 SQLiteDatabase db = this.openHelper.getReadableDatabase(); 4 Cursor cursor = db.query( 5 Constant.NewNewsTable.TBL_NAME, 6 new String[]{ 7 Constant.NewNewsTable.COL_ID, 8 Constant.NewNewsTable.COL_CTIME, 9 Constant.NewNewsTable.COL_DESCRIPTION, 10 Constant.NewNewsTable.COL_TITLE, 11 Constant.NewNewsTable.COL_PICURL, 12 Constant.NewNewsTable.COL_URL, 13 Constant.NewNewsTable.COL_NEWSTYPE 14 }, 15 Constant.NewNewsTable.COL_NEWSTYPE+" =?", 16 new String[]{type+""}, 17 null, 18 null, 19 null, 20 null 21 ); 22 while(cursor.moveToNext()){ 23 NetNews nn = new NetNews(); 24 nn.setTitle(cursor.getString(cursor.getColumnIndex(Constant.NewNewsTable.COL_TITLE))); 25 nn.setCtime(cursor.getString(cursor.getColumnIndex(Constant.NewNewsTable.COL_CTIME))); 26 nn.setDescription(cursor.getString(cursor.getColumnIndex(Constant.NewNewsTable.COL_DESCRIPTION))); 27 nn.setPicUrl(cursor.getString(cursor.getColumnIndex(Constant.NewNewsTable.COL_PICURL))); 28 nn.setUrl(cursor.getString(cursor.getColumnIndex(Constant.NewNewsTable.COL_URL))); 29 nn.setNewsType(cursor.getInt(cursor.getColumnIndex(Constant.NewNewsTable.COL_NEWSTYPE))); 30 list.add(nn); 31 } 32 cursor.close(); 33 db.close(); 34 return list; 35 }
这样对数据库的基本操作就算完成了,下面再赋一张数据库操作类的完整代码,大家在仔细琢磨一下吧:
1 public class NetNewsDao { 2 private NewsSQLiteOpenHelper openHelper; 3 public NetNewsDao(Context mContext){ 4 this.openHelper = new NewsSQLiteOpenHelper(mContext); 5 } 6 public List<NetNews> findNewsByType(int type){ 7 List<NetNews> list = new ArrayList<>(); 8 SQLiteDatabase db = this.openHelper.getReadableDatabase(); 9 Cursor cursor = db.query( 10 Constant.NewNewsTable.TBL_NAME, 11 new String[]{ 12 Constant.NewNewsTable.COL_ID, 13 Constant.NewNewsTable.COL_CTIME, 14 Constant.NewNewsTable.COL_DESCRIPTION, 15 Constant.NewNewsTable.COL_TITLE, 16 Constant.NewNewsTable.COL_PICURL, 17 Constant.NewNewsTable.COL_URL, 18 Constant.NewNewsTable.COL_NEWSTYPE 19 }, 20 Constant.NewNewsTable.COL_NEWSTYPE+" =?", 21 new String[]{type+""}, 22 null, 23 null, 24 null, 25 null 26 ); 27 while(cursor.moveToNext()){ 28 NetNews nn = new NetNews(); 29 nn.setTitle(cursor.getString(cursor.getColumnIndex(Constant.NewNewsTable.COL_TITLE))); 30 nn.setCtime(cursor.getString(cursor.getColumnIndex(Constant.NewNewsTable.COL_CTIME))); 31 nn.setDescription(cursor.getString(cursor.getColumnIndex(Constant.NewNewsTable.COL_DESCRIPTION))); 32 nn.setPicUrl(cursor.getString(cursor.getColumnIndex(Constant.NewNewsTable.COL_PICURL))); 33 nn.setUrl(cursor.getString(cursor.getColumnIndex(Constant.NewNewsTable.COL_URL))); 34 nn.setNewsType(cursor.getInt(cursor.getColumnIndex(Constant.NewNewsTable.COL_NEWSTYPE))); 35 list.add(nn); 36 } 37 cursor.close(); 38 db.close(); 39 return list; 40 } 41 public long addNetNews(NetNews nn){ 42 SQLiteDatabase db = this.openHelper.getReadableDatabase(); 43 ContentValues values = new ContentValues(); 44 values.put(Constant.NewNewsTable.COL_TITLE,nn.getTitle()); 45 values.put(Constant.NewNewsTable.COL_DESCRIPTION,nn.getDescription()); 46 values.put(Constant.NewNewsTable.COL_CTIME,nn.getCtime()); 47 values.put(Constant.NewNewsTable.COL_PICURL,nn.getPicUrl()); 48 values.put(Constant.NewNewsTable.COL_URL,nn.getPicUrl()); 49 values.put(Constant.NewNewsTable.COL_NEWSTYPE, nn.getNewsType()); 50 long id = db.insert( 51 Constant.NewNewsTable.TBL_NAME, 52 null, 53 values 54 ); 55 db.close(); 56 return id; 57 } 58 public void addNetNews(List<NetNews> netNewsList){ 59 for(NetNews nn:netNewsList){ 60 addNetNews(nn); 61 } 62 } 63 public void removeNewsByType(int type){ 64 SQLiteDatabase DB = this.openHelper.getReadableDatabase(); 65 //根据新闻类型删除 66 DB.delete( 67 Constant.NewNewsTable.TBL_NAME, 68 Constant.NewNewsTable.COL_NEWSTYPE+" =?", 69 new String[]{type+""} 70 ); 71 DB.close(); 72 } 73 }
好了,到现在我们就已经把数据库搭建完成,也把数据库的操作类写好了,在调用的时候就直接生成一个数据库操作对象对数据库进行操作就OK了。
安卓原始数据库的搭建以及操作类的编写还是很麻烦的,但是对于大家对于数据库的运行原理以及SQL语言的理解还是能起到了很大的作用的,对于初学者来说,夯实基础就显得尤为重要,而理解了数据库的原理在对以后的工作学习都有很大的裨益,所以还是建议大家多看看,在熟练了之后再使用ormlite以及greendao等Jar包搭建数据库的时候就显得更加的得心应手。好了,关于安卓原始数据库的搭建加写到这吧,如果大家感觉看过之后对于自己在数据库方面的理解起到了一些帮助的话就推荐一下吧,如果有哪些地方写的不好还希望大家评论指正,谢谢。