編輯:關於android開發
大家好,前幾天我寫了一篇關於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包搭建數據庫的時候就顯得更加的得心應手。好了,關於安卓原始數據庫的搭建加寫到這吧,如果大家感覺看過之後對於自己在數據庫方面的理解起到了一些幫助的話就推薦一下吧,如果有哪些地方寫的不好還希望大家評論指正,謝謝。
Android M Launcher3主流程源碼淺析 背景 關於Launcher是啥的問題我想這裡就沒必要再強調了。由於一些原因迫使最近開始需要研究一下Launcher3
界面優化處理技術之(二)編輯文本框組件優化處理,文本框組件開發步驟: 在res下drawable下創建xml文件 添加標簽設置顯示效果 1 <?xml ver
本節所要講的主要內容包括Android桌面小部件、App Widget的開發入
今天有時間就學習了下在ListView、GridView列表項中清加ProgressBar,本文用最簡單的代碼實現可以通用的功能,人人都能看懂,哈哈