高仿網易評論列表效果之資料準備(二)

yangxi_001發表於2016-01-11

上一篇文章我們分析了網易評論列表的介面效果,有了一個大概的瞭解後我們來為我們的評論列表做些資料,為了方便起見,就不通過伺服器來做了,我們直接用SQLite來模擬一個簡單的本地伺服器資料庫~~。經過我們前面的分析得出,我們的資料庫應該有這樣的三個表:

  1. User—>用來存放使用者的基本資訊,比如使用者名稱、使用者頭像和使用者的地理位置等
  2. Post—>用來存放帖子的基本資訊,比如帖子的建立時間等
  3. Comment—>用來存放評論的基本資訊,比如評論的內容等

在實際專案中我們可以通過伺服器後臺的一些配置來實現三者之間的關聯以方便使用,但是因為我們是用的SQLite且資料庫置於本地,我們就使用最原始的辦法,為表之間的關聯單獨建立一個關聯表

Post_Comment—>用來儲存Post和User之間的關聯

User_Praise—>用來儲存使用者和點贊帖子之間的關聯

User_UnPraise—>用來儲存使用者和被踩帖子之間的關聯

User_Collect—>用來儲存使用者和收藏帖子之間的關聯

有了這樣的一個關聯後我們還需要一個唯一的標識值來作為表之間關聯的標識,在Android中SQLite有主鍵_id,這個主鍵欄位我們不能隨意更改否則在進行Cursor查詢的時候會出錯,而且_id是自增長的Integer型別,其在每個表中都是獨立存在的,在我們進行標識的時候就有可能重複,鑑於此我們分別為User、Post和Comment表新增一個額外的flag欄位,該欄位的值我們在Android中使用UUID隨機生成。User、Post和Comment的大致關係我在PD中花了兩分鐘粗略畫了下(資料庫不是本節重點)如下圖:


PS:User和Post的多對多關係不會在例項中實現,但是會有體現

關聯表的模型就不給出了,下面我們來看看SQLite中構建表的SQL語句:

User表:

  1. create table user(_id integer primary key autoincrement, flag varchar(16), userName varchar(16), nick integer, location varchar(32))  
Post表:
  1. create table post(_id integer primary key autoincrement, flag varchar(16), createAt varchar(32))  
Comment表:
  1. create table comment(_id integer primary key autoincrement, flag varchar(16), userFlag varchar(16), content varchar(1024), createAt varchar(32))  

Post_Comment:

  1. create table post_comment(_id integer primary key autoincrement, postFlag varchar(16), commentFlag varchar(16))  

User_Praise:

  1. create table user_praise(_id integer primary key autoincrement, userFlag varchar(16), postFlag varchar(16))  

User_UnPraise:

  1. create table user_unpraise(_id integer primary key autoincrement, userFlag varchar(16), postFlag varchar(16))  

User_Collect:

  1. create table user_collect(_id integer primary key autoincrement, userFlag varchar(16), postFlag varchar(16))  

繼承SQLiteOpenHelper類開啟資料庫建表:

  1. package com.aigestudio.neteasecommentlistdemo.helper;  
  2.   
  3. import android.content.Context;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteOpenHelper;  
  6.   
  7. /** 
  8.  * SQLite資料幫助類 
  9.  * 
  10.  * @author Aige 
  11.  * @since 2014/11/14 
  12.  */  
  13. public class ServerDBHelper extends SQLiteOpenHelper {  
  14.     private static final String DB_NAME = "server.db";//資料庫名  
  15.     private static final int VERSION = 1;//資料庫版本  
  16.   
  17.     /* 
  18.     建立模型表SQL 
  19.      */  
  20.     private static final String CREATE_TABLE_USER_SQL = "create table user(_id integer primary key autoincrement, flag varchar(16), userName varchar(16), nick integer, location varchar(32))";  
  21.     private static final String CREATE_TABLE_POST_SQL = "create table post(_id integer primary key autoincrement, flag varchar(16), createAt varchar(32))";  
  22.     private static final String CREATE_TABLE_COMMENT_SQL = "create table comment(_id integer primary key autoincrement, flag varchar(16), userFlag varchar(16), content varchar(1024), createAt varchar(32))";  
  23.   
  24.     /* 
  25.     建立關聯表SQL 
  26.      */  
  27.     private static final String CREATE_TABLE_POST_AND_COMMENT_SQL = "create table post_comment(_id integer primary key autoincrement, postFlag varchar(16), commentFlag varchar(16))";  
  28.     private static final String CREATE_TABLE_USER_AND_PRAISE_SQL = "create table user_praise(_id integer primary key autoincrement, userFlag varchar(16), postFlag varchar(16))";  
  29.     private static final String CREATE_TABLE_USER_AND_UNPRAISE_SQL = "create table user_unpraise(_id integer primary key autoincrement, userFlag varchar(16), postFlag varchar(16))";  
  30.     private static final String CREATE_TABLE_USER_AND_COLLECT_SQL = "create table user_collect(_id integer primary key autoincrement, userFlag varchar(16), postFlag varchar(16))";  
  31.   
  32.     public ServerDBHelper(Context context) {  
  33.         super(context, DB_NAME, null, VERSION);  
  34.     }  
  35.   
  36.     @Override  
  37.     public void onCreate(SQLiteDatabase db) {  
  38.         db.execSQL(CREATE_TABLE_USER_SQL);  
  39.         db.execSQL(CREATE_TABLE_POST_SQL);  
  40.         db.execSQL(CREATE_TABLE_COMMENT_SQL);  
  41.         db.execSQL(CREATE_TABLE_POST_AND_COMMENT_SQL);  
  42.         db.execSQL(CREATE_TABLE_USER_AND_PRAISE_SQL);  
  43.         db.execSQL(CREATE_TABLE_USER_AND_UNPRAISE_SQL);  
  44.         db.execSQL(CREATE_TABLE_USER_AND_COLLECT_SQL);  
  45.     }  
  46.   
  47.     @Override  
  48.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  49.         //不浪費時間處理了  
  50.     }  
  51. }  
所有對伺服器資料庫操作的方法都會先封裝在介面IServerDAO.java中:

  1. package com.aigestudio.neteasecommentlistdemo.dao;  
  2.   
  3. import android.content.ContentValues;  
  4.   
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. /** 
  9.  * 伺服器資料層介面 
  10.  * 
  11.  * @author Aige 
  12.  * @since 2014/11/14 
  13.  */  
  14. public interface IServerDAO extends IDAO {  
  15.     /** 
  16.      * 根據引數新增一條資料 
  17.      * 
  18.      * @param table  資料要新增到的表名 
  19.      * @param values 資料物件 
  20.      * @return 布林值代表資料新增成功與否 
  21.      */  
  22.     public boolean add(String table, ContentValues values);  
  23.   
  24.     /** 
  25.      * 根據SQL語句新增一條資料 
  26.      * 
  27.      * @param sql SQL語句 
  28.      * @return 布林值代表資料新增成功與否 
  29.      */  
  30.     public boolean add(String sql);  
  31.   
  32.     /** 
  33.      * 根據條件引數多條資料查詢 
  34.      * 
  35.      * @param table         要查詢的資料所在的表名 
  36.      * @param columns       要查詢的列名 
  37.      * @param whereClause   查詢的條件子句 
  38.      * @param selectionArgs 條件子句佔位符的引數 
  39.      * @param groupBy       分組控制 
  40.      * @param having        分組過濾 
  41.      * @param orderBy       排序 
  42.      * @param limit         分頁 
  43.      * @return 資料列表 
  44.      */  
  45.     public List<Map<String, String>> queryMulti(String table, String[] columns, String whereClause, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);  
  46.   
  47.     /** 
  48.      * 根據SQL語句多條資料查詢 
  49.      * 
  50.      * @param sql SQL語句 
  51.      * @return 資料列表 
  52.      */  
  53.     public List<Map<String, String>> queryMulti(String sql);  
  54.   
  55.     /** 
  56.      * 根據條件引數單條資料查詢 
  57.      * 
  58.      * @param table   要查詢的資料所在的表名 
  59.      * @param columns 要查詢的列名 
  60.      * @param flag    唯一標識值 
  61.      * @param groupBy 分組控制 
  62.      * @param having  分組過濾 
  63.      * @param orderBy 排序 
  64.      * @param limit   分頁 
  65.      * @return 單條 
  66.      */  
  67.     public Map<String, String> querySingle(String table, String[] columns, String flag, String groupBy, String having, String orderBy, String limit);  
  68.   
  69.     /** 
  70.      * 根據SQL語句單條資料查詢 
  71.      * 
  72.      * @param sql SQL語句 
  73.      * @return 單條資料 
  74.      */  
  75.     public Map<String, String> querySingle(String sql);  
  76.   
  77.     /** 
  78.      * 根據條件查詢單個值 
  79.      * 
  80.      * @param table   要查詢的資料所在的表名 
  81.      * @param columns 要查詢的列名 
  82.      * @param key     查詢的依據的列名 
  83.      * @param value   查詢依據值 
  84.      * @return 查詢結果 
  85.      */  
  86.     public String queryValue(String table, String[] columns, String key, String value);  
  87.   
  88.     /** 
  89.      * 根據SQL語句查詢單個值 
  90.      * 
  91.      * @param sql SQL語句 
  92.      * @return 查詢結果 
  93.      */  
  94.     public String queryValue(String sql);  
  95. }  
具體實現在ServerDAO.java:

  1. package com.aigestudio.neteasecommentlistdemo.dao;  
  2.   
  3. import android.content.ContentValues;  
  4. import android.content.Context;  
  5. import android.database.Cursor;  
  6. import android.database.sqlite.SQLiteDatabase;  
  7.   
  8. import com.aigestudio.neteasecommentlistdemo.helper.ServerDBHelper;  
  9.   
  10. import java.util.ArrayList;  
  11. import java.util.HashMap;  
  12. import java.util.List;  
  13. import java.util.Map;  
  14.   
  15. /** 
  16.  * 伺服器資料層 
  17.  * 
  18.  * @author Aige 
  19.  * @since 2014/11/14 
  20.  */  
  21. public class ServerDAO implements IServerDAO {  
  22.     private ServerDBHelper dbHelper;  
  23.   
  24.     public ServerDAO(Context context) {  
  25.         dbHelper = new ServerDBHelper(context);  
  26.     }  
  27.   
  28.     @Override  
  29.     public boolean add(String table, ContentValues values) {  
  30.         boolean flag = false;  
  31.         SQLiteDatabase db = null;  
  32.         try {  
  33.             db = dbHelper.getWritableDatabase();  
  34.             long id = db.insert(table, null, values);  
  35.             flag = (id != -1 ? true : false);  
  36.         } catch (Exception e) {  
  37.             e.printStackTrace();  
  38.         } finally {  
  39.             if (null != db) {  
  40.                 db.close();  
  41.             }  
  42.         }  
  43.         return flag;  
  44.     }  
  45.   
  46.     @Override  
  47.     public boolean add(String sql) {  
  48.         //未實現  
  49.         return false;  
  50.     }  
  51.   
  52.     @Override  
  53.     public List<Map<String, String>> queryMulti(String table, String[] columns, String whereClause, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) {  
  54.         List<Map<String, String>> list = new ArrayList<Map<String, String>>();  
  55.         SQLiteDatabase db = null;  
  56.         Cursor cursor;  
  57.         try {  
  58.             db = dbHelper.getWritableDatabase();  
  59.             cursor = db.query(table, columns, whereClause, selectionArgs, groupBy, having, orderBy, limit);  
  60.             while (cursor.moveToNext()) {  
  61.                 Map<String, String> map = new HashMap<String, String>();  
  62.                 for (int i = 0; i < cursor.getColumnCount(); i++) {  
  63.                     String columnName = cursor.getColumnName(i);  
  64.                     String columnValue = cursor.getString(cursor.getColumnIndex(columnName));  
  65.                     map.put(columnName, columnValue);  
  66.                 }  
  67.                 list.add(map);  
  68.             }  
  69.         } catch (Exception e) {  
  70.             e.printStackTrace();  
  71.         } finally {  
  72.             if (null != db) {  
  73.                 db.close();  
  74.             }  
  75.         }  
  76.         return list;  
  77.     }  
  78.   
  79.     @Override  
  80.     public List<Map<String, String>> queryMulti(String sql) {  
  81.         List<Map<String, String>> list = new ArrayList<Map<String, String>>();  
  82.         SQLiteDatabase db = null;  
  83.         Cursor cursor;  
  84.         try {  
  85.             db = dbHelper.getWritableDatabase();  
  86.             cursor = db.rawQuery(sql, null);  
  87.             while (cursor.moveToNext()) {  
  88.                 Map<String, String> map = new HashMap<String, String>();  
  89.                 for (int i = 0; i < cursor.getColumnCount(); i++) {  
  90.                     String columnName = cursor.getColumnName(i);  
  91.                     String columnValue = cursor.getString(cursor.getColumnIndex(columnName));  
  92.                     map.put(columnName, columnValue);  
  93.                 }  
  94.                 list.add(map);  
  95.             }  
  96.         } catch (Exception e) {  
  97.             e.printStackTrace();  
  98.         } finally {  
  99.             if (null != db) {  
  100.                 db.close();  
  101.             }  
  102.         }  
  103.         return list;  
  104.     }  
  105.   
  106.     @Override  
  107.     public Map<String, String> querySingle(String table, String[] columns, String flag, String groupBy, String having, String orderBy, String limit) {  
  108.         Map<String, String> map = new HashMap<String, String>();  
  109.         SQLiteDatabase db = null;  
  110.         Cursor cursor;  
  111.         try {  
  112.             db = dbHelper.getWritableDatabase();  
  113.             cursor = db.query(table, columns, "flag like ?"new String[]{flag}, groupBy, having, orderBy, limit);  
  114.             while (cursor.moveToNext()) {  
  115.                 for (int i = 0; i < cursor.getColumnCount(); i++) {  
  116.                     String columnName = cursor.getColumnName(i);  
  117.                     String columnValue = cursor.getString(cursor.getColumnIndex(columnName));  
  118.                     map.put(columnName, columnValue);  
  119.                 }  
  120.             }  
  121.         } catch (Exception e) {  
  122.             e.printStackTrace();  
  123.         } finally {  
  124.             if (null != db) {  
  125.                 db.close();  
  126.             }  
  127.         }  
  128.         return map;  
  129.     }  
  130.   
  131.     @Override  
  132.     public Map<String, String> querySingle(String sql) {  
  133.         return null;  
  134.     }  
  135.   
  136.     @Override  
  137.     public String queryValue(String table, String[] columns, String key, String value) {  
  138.         String result = null;  
  139.         SQLiteDatabase db = null;  
  140.         try {  
  141.             db = dbHelper.getWritableDatabase();  
  142.             Cursor cursor = db.query(table, columns, key + " like ?"new String[]{value}, nullnullnullnull);  
  143.             cursor.moveToNext();  
  144.             String columnName = cursor.getColumnName(0);  
  145.             result = cursor.getString(cursor.getColumnIndex(columnName));  
  146.         } catch (Exception e) {  
  147.             e.printStackTrace();  
  148.         } finally {  
  149.             if (null != db) {  
  150.                 db.close();  
  151.             }  
  152.         }  
  153.         return result;  
  154.     }  
  155.   
  156.     @Override  
  157.     public String queryValue(String sql) {  
  158.         //未實現  
  159.         return null;  
  160.     }  
  161. }  
就兩種方法:增加資料和查詢資料,其他的未做在本例中也不需要~~。資料層的實現完成後我們來看看如何往資料庫中新增一些測試資料呢。

首先先建立不同的物件實體:

  1. package com.aigestudio.neteasecommentlistdemo.beans;  
  2.   
  3. import com.aigestudio.neteasecommentlistdemo.cons.ClsCons;  
  4.   
  5. import java.util.UUID;  
  6.   
  7. /** 
  8.  * 使用者實體 
  9.  * 
  10.  * @author Aige 
  11.  * @since 2014/11/14 
  12.  */  
  13. public class User {  
  14.     /* 
  15.     對應資料庫表列名 
  16.      */  
  17.     public static final String COLUMN_FLAG = "flag", COLUMN_USERNAME = "userName", COLUMN_LOCATION = "location", COLUMN_NICK = "nick";  
  18.   
  19.     private String flag;//使用者標識系統隨機生成  
  20.     private String userName;//使用者名稱  
  21.     private String location;//使用者當前所在位置  
  22.     private String nick;//使用者頭像資源ID  
  23.   
  24.     /** 
  25.      * 使用者實體的建構函式,建立使用者插入資料庫時使用 
  26.      */  
  27.     public User() {  
  28.         this.flag = UUID.randomUUID().toString();  
  29.         this.userName = ClsCons.USER_NAME[(int) (Math.random() * 10)];  
  30.         this.location = ClsCons.DEFAULT_LOCATION[(int) (Math.random() * 5)];  
  31.         this.nick = ClsCons.DEFAULT_NICK_RESID[(int) (Math.random() * 3)];  
  32.     }  
  33.   
  34.     /** 
  35.      * 使用者實體的建構函式,從資料庫獲取使用者資料並例項化物件時使用 
  36.      * 
  37.      * @param flag     使用者標識 
  38.      * @param userName 使用者名稱 
  39.      * @param location 使用者地理位置 
  40.      * @param nick     使用者頭像資源ID 
  41.      */  
  42.     public User(String flag, String userName, String location, String nick) {  
  43.         this.flag = flag;  
  44.         this.userName = userName;  
  45.         this.location = location;  
  46.         this.nick = nick;  
  47.     }  
  48.   
  49.     public String getFlag() {  
  50.         return flag;  
  51.     }  
  52.   
  53.     public void setFlag(String flag) {  
  54.         this.flag = flag;  
  55.     }  
  56.   
  57.     public String getUserName() {  
  58.         return userName;  
  59.     }  
  60.   
  61.     public void setUserName(String userName) {  
  62.         this.userName = userName;  
  63.     }  
  64.   
  65.     public String getLocation() {  
  66.         return location;  
  67.     }  
  68.   
  69.     public void setLocation(String location) {  
  70.         this.location = location;  
  71.     }  
  72.   
  73.     public String getNick() {  
  74.         return nick;  
  75.     }  
  76.   
  77.     public void setNick(String nick) {  
  78.         this.nick = nick;  
  79.     }  
  80. }  
  1. package com.aigestudio.neteasecommentlistdemo.beans;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5. import java.util.List;  
  6. import java.util.Locale;  
  7. import java.util.UUID;  
  8.   
  9. /** 
  10.  * 帖子實體類 
  11.  * 注:實體類的結構在實際專案中應在一定程度上參照伺服器後臺對應表的資料結構來設計,這裡我就不多BB了 
  12.  * 
  13.  * @author Aige 
  14.  * @since 2014/11/14 
  15.  */  
  16. public class Post {  
  17.     private String flag;//評論標識:系統隨機生成  
  18.     private String createAt;//評論時間:系統生成  
  19.     private List<Comment> comments;//該帖子下的所有評論,按插入資料庫的_id順序排列保證時間先後的統一  
  20.     private List<User> userPraises, userUnPraises, userCollects;//該帖子讚的人數、踩的人數和收藏的人數  
  21.     private Type type;//帖子型別:最新,最熱or普通  
  22.   
  23.     /** 
  24.      * 評論實體的建構函式 
  25.      * 兩個成員變數均由系統賦值 
  26.      */  
  27.     public Post() {  
  28.         //生成隨機標識,這個隨機標識準確來說應該是服務端生成,這裡就不麻煩了 = =  
  29.         flag = UUID.randomUUID().toString();  
  30.   
  31.         //生成系統時間,這個資料建立時間也應該是服務端生成  
  32.         Date date = new Date();  
  33.         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss", Locale.getDefault());  
  34.         this.createAt = format.format(date);  
  35.     }  
  36.   
  37.     public String getFlag() {  
  38.         return flag;  
  39.     }  
  40.   
  41.     public void setFlag(String flag) {  
  42.         this.flag = flag;  
  43.     }  
  44.   
  45.     public String getCreateAt() {  
  46.         return createAt;  
  47.     }  
  48.   
  49.     public void setCreateAt(String createAt) {  
  50.         this.createAt = createAt;  
  51.     }  
  52.   
  53.     public List<Comment> getComments() {  
  54.         return comments;  
  55.     }  
  56.   
  57.     public void setComments(List<Comment> comments) {  
  58.         this.comments = comments;  
  59.     }  
  60.   
  61.     public List<User> getUserPraises() {  
  62.         return userPraises;  
  63.     }  
  64.   
  65.     public void setUserPraises(List<User> userPraises) {  
  66.         this.userPraises = userPraises;  
  67.     }  
  68.   
  69.     public List<User> getUserUnPraises() {  
  70.         return userUnPraises;  
  71.     }  
  72.   
  73.     public void setUserUnPraises(List<User> userUnPraises) {  
  74.         this.userUnPraises = userUnPraises;  
  75.     }  
  76.   
  77.     public List<User> getUserCollects() {  
  78.         return userCollects;  
  79.     }  
  80.   
  81.     public void setUserCollects(List<User> userCollects) {  
  82.         this.userCollects = userCollects;  
  83.     }  
  84.   
  85.     public Type getType() {  
  86.         return type;  
  87.     }  
  88.   
  89.     public void setType(Type type) {  
  90.         this.type = type;  
  91.     }  
  92.   
  93.     /** 
  94.      * 帖子型別的列舉類 
  95.      */  
  96.     public enum Type {  
  97.         HOTTEST, NEWEST, NORMAL  
  98.     }  
  99. }  
  1. package com.aigestudio.neteasecommentlistdemo.beans;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5. import java.util.Locale;  
  6. import java.util.UUID;  
  7.   
  8. /** 
  9.  * 評論實體類 
  10.  * 
  11.  * @author Aige 
  12.  * @since 2014/11/14 
  13.  */  
  14. public class Comment {  
  15.     /* 
  16.     對應資料庫表列名 
  17.      */  
  18.     public static final String COLUMN_FLAG = "flag", COLUMN_USERFLAG = "userFlag", COLUMN_CONTENT = "content", COLUMN_CREATEAT = "createAt";  
  19.   
  20.     private String flag;//評論標識:系統隨機生成  
  21.     private String content;//評論內容  
  22.     private String createAt;//評論時間:系統生成  
  23.     private User user;//使用者實體  
  24.   
  25.     /** 
  26.      * 評論實體的建構函式,生成評論插入資料庫時使用 
  27.      * 
  28.      * @param content 評論內容 
  29.      */  
  30.     public Comment(String content, User user) {  
  31.         //生成隨機標識,這個隨機標識準確來說應該是服務端生成,這裡就不麻煩了 = =  
  32.         flag = UUID.randomUUID().toString();  
  33.   
  34.         //生成系統時間,這個資料建立時間也應該是服務端生成  
  35.         Date date = new Date();  
  36.         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss", Locale.getDefault());  
  37.         this.createAt = format.format(date);  
  38.         this.user = user;  
  39.         this.content = content;  
  40.     }  
  41.   
  42.     /** 
  43.      * 評論實體的建構函式,從資料庫獲取評論資料並例項化物件時使用 
  44.      * 
  45.      * @param flag     評論標識 
  46.      * @param user     評論使用者的使用者 
  47.      * @param content  評論內容 
  48.      * @param createAt 評論時間 
  49.      */  
  50.     public Comment(String flag, String content, String createAt, User user) {  
  51.         this.flag = flag;  
  52.         this.content = content;  
  53.         this.createAt = createAt;  
  54.         this.user = user;  
  55.     }  
  56.   
  57.     public String getFlag() {  
  58.         return flag;  
  59.     }  
  60.   
  61.     public void setFlag(String flag) {  
  62.         this.flag = flag;  
  63.     }  
  64.   
  65.     public String getContent() {  
  66.         return content;  
  67.     }  
  68.   
  69.     public void setContent(String content) {  
  70.         this.content = content;  
  71.     }  
  72.   
  73.     public String getCreateAt() {  
  74.         return createAt;  
  75.     }  
  76.   
  77.     public void setCreateAt(String createAt) {  
  78.         this.createAt = createAt;  
  79.     }  
  80.   
  81.     public User getUser() {  
  82.         return user;  
  83.     }  
  84.   
  85.     public void setUser(User user) {  
  86.         this.user = user;  
  87.     }  
  88. }  

然後我們得建立10個不同的使用者來模擬不同使用者的評論效果:

  1. /* 
  2. 建立使用者資料 
  3.  */  
  4. for (int i = 0; i < 10; i++) {  
  5.     User user = new User();  
  6.     ContentValues values = new ContentValues();  
  7.     values.put("flag", user.getFlag());  
  8.     values.put("userName", user.getUserName());  
  9.     values.put("nick", user.getNick());  
  10.     values.put("location", user.getLocation());  
  11.     serverDAO.add("user", values);  
  12.   
  13.     //物件標識儲存便於後續操作  
  14.     userFlagList.add(user.getFlag());  
  15.   
  16.     users.add(user);  
  17. }  
建立使用者後我們會把生成的使用者標識flag存入一個列表用來關聯一些其他的資訊,而把整個User實體存入一個列表用來將其隨機繫結到Comment實體中,下面建立100個帖子
  1. /* 
  2. 建立帖子資料 
  3.  */  
  4. for (int i = 0; i < 100; i++) {  
  5.     Post comment = new Post();  
  6.     ContentValues values = new ContentValues();  
  7.     values.put("flag", comment.getFlag());  
  8.     values.put("createAt", comment.getCreateAt());  
  9.     serverDAO.add("post", values);  
  10.   
  11.     //物件標識儲存便於後續操作  
  12.     postFlagList.add(comment.getFlag());  
  13. }  
同樣地把生成的帖子flag標識存入列表,之後建立100條評論資料:

  1. /* 
  2. 建立評論資料 
  3.  */  
  4. for (int i = 0; i < 100; i++) {  
  5.     Comment comment = new Comment(Util.getRandomSimplified((int) (Math.random() * 100)), users.get((int) (Math.random() * 10)));  
  6.     ContentValues values = new ContentValues();  
  7.     values.put("flag", comment.getFlag());  
  8.     values.put("userFlag", comment.getUser().getFlag());  
  9.     values.put("content", comment.getContent());  
  10.     values.put("createAt", comment.getCreateAt());  
  11.     serverDAO.add("comment", values);  
  12.   
  13.     //物件標識儲存便於後續操作  
  14.     commentFlagList.add(comment.getFlag());  
  15. }  
在生成評論時,將上面生成的User隨機選取注入其建構函式完成User和Comment的繫結,最後就是隨機關聯各種資料了~~~~灰常簡單
  1. /* 
  2. 關聯帖子和評論的資料 
  3.  */  
  4. for (String post : postFlagList) {  
  5.     /* 
  6.     每條評論最多50條回覆 
  7.      */  
  8.     for (int i = 0; i < (int) (Math.random() * 50); i++) {  
  9.         ContentValues values = new ContentValues();  
  10.         values.put("postFlag", post);  
  11.         values.put("commentFlag", commentFlagList.get((int) (Math.random() * commentFlagList.size())));  
  12.         serverDAO.add("post_comment", values);  
  13.     }  
  14. }  
  15. /* 
  16. 關聯使用者贊資料 
  17.  */  
  18. for (String user : userFlagList) {  
  19.     /* 
  20.     每個使用者最多贊10個帖子 
  21.      */  
  22.     for (int i = 0; i < (int) (Math.random() * 10); i++) {  
  23.         ContentValues values = new ContentValues();  
  24.         values.put("userFlag", user);  
  25.   
  26.         //從帖子列表中隨機挑選  
  27.         values.put("postFlag", postFlagList.get((int) (Math.random() * postFlagList.size())));  
  28.         serverDAO.add("user_praise", values);  
  29.     }  
  30. }  
  31. /* 
  32. 關聯使用者踩資料 
  33.  */  
  34. for (String user : userFlagList) {  
  35.     /* 
  36.     每個使用者最多踩10個帖子 
  37.      */  
  38.     for (int i = 0; i < (int) (Math.random() * 10); i++) {  
  39.         ContentValues values = new ContentValues();  
  40.         values.put("userFlag", user);  
  41.   
  42.         //從帖子列表中隨機挑選  
  43.         values.put("postFlag", postFlagList.get((int) (Math.random() * postFlagList.size())));  
  44.         serverDAO.add("user_unpraise", values);  
  45.     }  
  46. }  
  47.   /* 
  48. 關聯使用者收藏資料 
  49.  */  
  50. for (String user : userFlagList) {  
  51.     /* 
  52.     每個使用者最多踩10個帖子 
  53.      */  
  54.     for (int i = 0; i < (int) (Math.random() * 10); i++) {  
  55.         ContentValues values = new ContentValues();  
  56.         values.put("userFlag", user);  
  57.   
  58.         //從帖子列表中隨機挑選  
  59.         values.put("postFlag", postFlagList.get((int) (Math.random() * postFlagList.size())));  
  60.         serverDAO.add("user_collect", values);  
  61.     }  
  62. }  
所有的這些資料建立的業務邏輯都被封裝在SQLiteDataBO.java類中:

  1. package com.aigestudio.neteasecommentlistdemo.bo;  
  2.   
  3. import android.content.ContentValues;  
  4. import android.content.Context;  
  5.   
  6. import com.aigestudio.neteasecommentlistdemo.beans.Comment;  
  7. import com.aigestudio.neteasecommentlistdemo.beans.Post;  
  8. import com.aigestudio.neteasecommentlistdemo.beans.User;  
  9. import com.aigestudio.neteasecommentlistdemo.dao.ServerDAO;  
  10. import com.aigestudio.neteasecommentlistdemo.utils.Util;  
  11.   
  12. import java.util.ArrayList;  
  13. import java.util.List;  
  14.   
  15. /** 
  16.  * 建立資料的一些業務邏輯 
  17.  * 
  18.  * @author Aige 
  19.  * @since 2014/11/14 
  20.  */  
  21. public class SQLiteDataBO {  
  22.     private ServerDAO serverDAO;//伺服器資料的訪問物件  
  23.   
  24.     private List<String> userFlagList, postFlagList, commentFlagList;//使用者唯一標識、帖子唯一標識、評論唯一標識列表資料  
  25.     private List<User> users;//使用者列表:用於模擬多個使用者操作  
  26.   
  27.     public SQLiteDataBO(Context context) {  
  28.         serverDAO = new ServerDAO(context);  
  29.     }  
  30.   
  31.     /** 
  32.      * 初始化伺服器資料 
  33.      */  
  34.     public void initServerData() {  
  35.         //初始化Flag列表  
  36.         userFlagList = new ArrayList<String>();  
  37.         postFlagList = new ArrayList<String>();  
  38.         commentFlagList = new ArrayList<String>();  
  39.   
  40.         users = new ArrayList<User>();  
  41.   
  42.         /* 
  43.         建立使用者資料 
  44.          */  
  45.   
  46.         /* 
  47.         建立帖子資料 
  48.          */  
  49.   
  50.         /* 
  51.         建立評論資料 
  52.          */  
  53.   
  54.         /* 
  55.         關聯帖子和評論的資料 
  56.          */  
  57.   
  58.         /* 
  59.         關聯使用者贊資料 
  60.          */  
  61.   
  62.         /* 
  63.         關聯使用者踩資料 
  64.          */  
  65.   
  66.           /* 
  67.         關聯使用者收藏資料 
  68.          */  
  69.   
  70.     }  
  71. }  
其中用到的常量類ClsCons.java定義了我們的一些模型資料:

  1. package com.aigestudio.neteasecommentlistdemo.cons;  
  2.   
  3. import com.aigestudio.neteasecommentlistdemo.R;  
  4.   
  5. /** 
  6.  * 存放一些應用的常量類 
  7.  * 
  8.  * @author Aige 
  9.  * @since 2014/11/14 
  10.  */  
  11. public class ClsCons {  
  12.     /* 
  13.     使用者名稱陣列:用來模擬不同的使用者操作(僅供參考) 
  14.      */  
  15.     public static final String[] USER_NAME = {"斯蒂芬·愛哥""羅羅亞·草泥馬""宇智波·逗比""艾斯比·莊臣""八歧大蛇""蒙奇·D·肏飛""漩渦·溜溜球""蠟筆·大大新""虛妄之諾""風間·八神"};//固定的使用者名稱}  
  16.     /* 
  17.     地理位置陣列:用來模擬不同的地理位置(僅供參考) 
  18.      */  
  19.     public static final String[] DEFAULT_LOCATION = {"網易火星網友""網易天狼星網友""網易太陽網友""網易逗比網友""網易尼麻痺網友"};  
  20.     /* 
  21.     使用者頭像的資源ID陣列:用來模擬不同的使用者頭像 
  22.      */  
  23.     public static final String[] DEFAULT_NICK_RESID = {String.valueOf(R.drawable.nick1), String.valueOf(R.drawable.nick2), String.valueOf(R.drawable.nick3)};  
  24. }  
萬事俱備,當應用啟動時我們先不顯示任何東西,而先建立資料:

  1. @Override  
  2. protected void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.     setContentView(R.layout.activity_main);  
  5.   
  6.     //初始化控制元件  
  7. //        initWidget();  
  8.   
  9.     //初始化資料  
  10.     sqLiteDataBO = new SQLiteDataBO(this);  
  11.     sqLiteDataBO.initServerData();  
  12. }  
資料只需建立一次即可,永久使用(注:如果你clean了專案記得要重新生成資料,因為頭像資源ID在clean後有可能改變與插入資料庫的ID值不同),資料生成好後我們可以在
SQLiteManager中檢視下生成的資料:



好了~~測試資料的建立就講到這裡,勞資都煩了越寫越不曉得寫了什麼……囧!下一節我們將進入核心部分~~來實現這麼一個評論列表~~先來兩張高清無碼大圖養養眼



1

相關文章