標籤:
之前學習oracle,簡單的認為資料庫只存在伺服器端,學習安卓之後才發現原來android和Ios本身是“攜帶”資料庫的——SQLite,是輕量級的、嵌入式的、關係型資料庫,是Android、IOS等廣泛使用的的資料庫系統。用於儲存本地的一直狀態。剛寫出來一個實現新聞收藏的功能,寫出來供大家參考。
在Android中我們通過SQLiteDatabase這個類的對象操作SQLite資料庫。由於SQLite資料庫並不需要像C/S資料庫那樣建立串連以及身分識別驗證的特性,以及SQLite資料庫單檔案資料庫的特性,使得獲得SQLiteDatabase對象就像獲得操作檔案的對象那樣簡單。
sqlite要經過建立資料庫、建立表,然後進行增刪改查等功能。所以第一步,建立一個資料庫,SQliteOpenHelper是一個抽象類別,來管理資料庫的建立和版本的管理。要使用它必須實現它的nCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase, int, int)方法
//建立資料庫,建表
1 private static final String DBNAME="news.db"; 2 private static final int VERSION=3; //設定版本號碼 3 private static final String TBL_DETAILNEWS="news"; //建立表名為news的表 4 private static final String TBL_DETAILNEWS_COLUMN_TITLE="_title"; 5 private static final String TBL_DETAILNEWS_COLUMN_URL="_url"; 6 private static final String TBL_DETAILNEWS_COLUMN_DOCID="_docid"; 7 private static final String TBL_DETAILNEWS_COLUMN_STATE="_state"; 8 9 public NewsDBHelper(Context context){10 super(context,DBNAME,null,VERSION);11 }12 13 @Override14 public void onCreate(SQLiteDatabase db) {15 // TODO Auto-generated method stub16 StringBuffer sb=new StringBuffer();17 sb.append("create table if not exists ");18 sb.append(TBL_DETAILNEWS+"(");19 sb.append(TBL_DETAILNEWS_COLUMN_DOCID +" varchar(100) primary key ,"); //設定主鍵20 sb.append(TBL_DETAILNEWS_COLUMN_TITLE+ " varchar(100) ,");21 sb.append(TBL_DETAILNEWS_COLUMN_URL+" varchar(100) ,");22 sb.append(TBL_DETAILNEWS_COLUMN_STATE+" integer ");23 sb.append(")");24 db.execSQL(sb.toString());25 26 }27 @Override28 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {29 String sql2="drop table if exists "+TBL_DETAILNEWS;30 db.execSQL(sql2); //建立31 onCreate(db);32 }
Android提供了一個名為SQLiteDatabase的類,它封裝了一些操作資料庫的API。使用它能實現基本的CRUD操作,通過getWritableDatabase()和getReadableDatabase()可以擷取資料庫執行個體,便可以寫一些dao層的方法來進行對錶的操作:
public class DetailNewsDao { private NewsDBHelper helper; public DetailNewsDao(Context context){ helper=new NewsDBHelper(context); //與資料庫建立串連 } //插入資料 public void insertDetsilNews(News news){ SQLiteDatabase db=helper.getWritableDatabase(); db.execSQL("insert into news(_title,_url,_docid)" + //將要收藏新聞的標題title,標識docid,詳細地址url傳入資料庫,便可以依此開啟新聞詳顯 "values(?,?,?)",new String[]{news.getTitle(),news.getDetailUrl(),news.getDocid()}); db.close(); } //刪除資料 public void del(String docid){ //根據傳入參數docid刪除資料 SQLiteDatabase db=helper.getReadableDatabase(); db.execSQL("delete from news where _docid = ?",new Object[]{docid}); db.close(); } //查詢資料 public List<News> findSelected(){ SQLiteDatabase db=helper.getReadableDatabase(); Cursor c=db.rawQuery("select * from news", null); //只有對資料進行查詢時,才用rawQuery(),增、刪、改和建表,都用execSQl() List<News> list=new ArrayList<News>(); while(c.moveToNext()){ News news=new News(); news.setTitle(c.getString(c.getColumnIndex("_title"))); news.setDetailUrl(c.getString(c.getColumnIndex("_url"))); news.setDocid(c.getString(c.getColumnIndex("_docid"))); list.add(news); } c.close(); db.close(); return list; }}
用actionbar做好功能表按鈕,點擊收藏,執行代碼 :
if(item.getTitle().equals("收藏")){ Toast.makeText(this,"收藏成功", Toast.LENGTH_LONG).show(); detailNewsDao.insertDetsilNews(news); item.setTitle("移除最愛"); }else{ detailNewsDao.del(news.getDocid()); Toast.makeText(this,"移除最愛", Toast.LENGTH_LONG).show(); item.setTitle("收藏"); }
這樣整個收藏,移除最愛就做好了。
sqlite實現新聞收藏和移除最愛