安卓中資料庫的搭建與使用

来源:http://www.cnblogs.com/zhangdiIT/archive/2016/09/05/5843752.html
-Advertisement-
Play Games

大家好,前幾天我寫了一篇關於ormlite資料庫的使用方法,對於資料庫的使用是很方便,搭建起來也非常簡單,因為底層的關於資料庫的SQL語言都已經封裝成了方法,所以對於規避錯誤與使用都是很便捷,但是對於剛開始接觸資料庫的同學們來說,沒有弄清楚原理直接就使用,對於接受方面顯然是弊大於利的,所以今天我就帶 ...


  大家好,前幾天我寫了一篇關於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包搭建資料庫的時候就顯得更加的得心應手。好了,關於安卓原始資料庫的搭建加寫到這吧,如果大家感覺看過之後對於自己在資料庫方面的理解起到了一些幫助的話就推薦一下吧,如果有哪些地方寫的不好還希望大家評論指正,謝謝。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如果說XHTML已經開始尋求取代HTML,那麼HTML5的實用性在於,它將兩種語法整合在一起,採用同樣有效的方式來表達HTML的抽象DOM表示。HTML5規範結合了HTML4,XHTML1以及DOM級別2HTML,併進行了相應的更新。 HTML5取代XHTML 1成為HTML規範的XML序列化格式。 ...
  • 通過案例演示開關控制項Switch、滑塊控制項Slider和分段控制項Segmented Control的使用。 ...
  • 本文主要講述了Android 實現圖片畫畫板 設計項目佈局: 首先實現畫圖功能: 接下來完成保存圖片的功能: ...
  • 1:Assertion failure in dequeueReusableCellWithIdentifier:forIndexPath: 上面是在IOS9以下一直報閃退;後來改成下麵解決: 2:CoreTelephony框架不是私有庫 私有框架的目錄為:/Applications/Xcode.a ...
  • Text用於顯示文本的React組件,並且它也支持嵌套、樣式,以及觸摸處理。在下麵的例子里,嵌套的標題和正文文字會繼承來自styles.baseText的fontFamily字體樣式,不過標題上還附加了它自己額外的樣式。標題和文本會在頂部依次堆疊,並且被代碼中內嵌的換行符分隔開。 一:屬性 1:al ...
  • Swift - UIView的無損截圖 效果 源碼 使用 ...
  • ListView 顯示大量相同格式數據 常用屬性: listSelector listView每項在選中、按下等不同狀態時的Drawable divider ListView每項間的間隔Drawable dividerHeight ListView每項間間隔的間隔高度 常用方法: setAdapte ...
  • 系列開篇,準備將方向由安卓開發轉向移動安全,首先需要瞭解的就是Android的逆向工程。 現在簡要介紹初級階段需要的工具以及如何獲取並正確配置他們 如果在資源獲取方面遇到困難,留下郵箱我會將所有東西打包發給你 JRE,JDK,SDK,NDK 關於這些工具包的配置不做贅述。 apktool apkto ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...