1.NewsChannelBean简单类笔记

1.1.Comparable接口的实现和使用

  参考文章:Comparable接口的实现和使用。

  因为NewsChannelBean实现了Comparable<NewsChannelBean>

public class NewsChannelBean implements Comparable<NewsChannelBean>

  一开始不明白为什么要实现这个接口。

  ==>其实就是强行对实现它的每个类的对象进行整体排序。

  

  之后会报错,因为没有重写比较函数。

  再重写一个这个函数进行大小比较

 @Override
    public int compareTo(@NonNull NewsChannelBean o) {
        return this.position - o.getPosition();
    }

  这个bean类有一个position。所以间接利用position进行了大小的排序。写得非常妙。

  

1.2.重写一个equals函数判断两个对象是否相等 

 @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;
        NewsChannelBean bean = (NewsChannelBean) o;
        if (isEnable != bean.isEnable)
            return false;
        if (position != bean.position)
            return false;
        if (channelId != null ? 
          !channelId.equals(bean.channelId) : bean.channelId != null) return false; return channelName != null ?
          channelName.equals(bean.channelName) : bean.channelName == null; }

  整个比较过程就是按照顺序一个一个比较,直到全部都相同为止。

 

1.3.重写equals的时候,必须重写hashCode函数。

  参考文章:浅谈Java中的hashcode方法。 

下面这段话摘自Effective Java一书:

在程序执行期间,只要equals方法的比较操作用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法必须始终
如一地返回同一个整数。 如果两个对象根据equals方法比较是相等的,那么调用两个对象的hashCode方法必须返回相同的整数结果。 如果两个对象根据equals方法比较是不等的,则hashCode方法不一定得返回不同的整数。   对于第二条和第三条很好理解,但是第一条,很多时候就会忽略。在《Java编程思想》一书中的P495页也有同第一条类似的
一段话:   “设计hashCode()时最重要的因素就是:无论何时,对同一个对象调用hashCode()都应该产生同样的值。
如果在讲一个对象用put()添加进HashMap时产生一个hashCdoe值,而用get()取出时却产生了另一个hashCode值,
那么就无法获取该对象了。所以如果你的hashCode方法依赖于对象中易变的数据,用户就要当心了,
因为此数据发生变化时,hashCode()方法就会生成一个不同的散列码”。

  这里重写返回哈希的函数为:

 @Override
    public int hashCode() {
        int result = channelId != null ? channelId.hashCode() : 0;
        result = 31 * result + (channelName != null ? channelName.hashCode() : 0);
        result = 31 * result + isEnable;
        result = 31 * result + position;
        return result;
    }

 

1.4.所以整个bean类就搞定了。

package com.meiji.toutiao.bean.news;

import android.support.annotation.NonNull;

/**
 * Created by Meiji on 2017/3/10.
 */

public class NewsChannelBean implements Comparable<NewsChannelBean> {

    private String channelId;
    private String channelName;
    private int isEnable;
    private int position;

    public String getChannelId() {
        return channelId;
    }

    public void setChannelId(String channelId) {
        this.channelId = channelId;
    }

    public String getChannelName() {
        return channelName;
    }

    public void setChannelName(String channelName) {
        this.channelName = channelName;
    }

    public int getIsEnable() {
        return isEnable;
    }

    public void setIsEnable(int isEnable) {
        this.isEnable = isEnable;
    }

    public int getPosition() {
        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;
        NewsChannelBean bean = (NewsChannelBean) o;
        if (isEnable != bean.isEnable)
            return false;
        if (position != bean.position)
            return false;
        if (channelId != null ? !channelId.equals(bean.channelId) : bean.channelId != null)
            return false;
        return channelName != null ? channelName.equals(bean.channelName) : bean.channelName == null;
    }

    @Override
    public int hashCode() {
        int result = channelId != null ? channelId.hashCode() : 0;
        result = 31 * result + (channelName != null ? channelName.hashCode() : 0);
        result = 31 * result + isEnable;
        result = 31 * result + position;
        return result;
    }

    @Override
    public int compareTo(@NonNull NewsChannelBean o) {
        return this.position - o.getPosition();
    }
}
View Code


2.构造NewsChannelDao处理底层数据增删查改

2.1.获取可以写数据库的实例。 

    private SQLiteDatabase db;

    public NewsChannelDao() {
        this.db = DatabaseHelper.getDatabase();
    }

  这个DatabaseHelper是一个自定义的数据库帮助类,用来产生可以写数据库的实例。而且要求加上同步锁。

  //这里是DatabaseHelper类
  public
static synchronized SQLiteDatabase getDatabase() { if (db == null) { db = getInstance().getWritableDatabase(); } return db; }

  

2.2.添加初始数据。

public void addInitData() {
        String categoryId[] = InitApp.AppContext.getResources().getStringArray
                                      (R.array.mobile_news_id); String categoryName[]
= InitApp.AppContext.getResources().getStringArray
                                      (R.array.mobile_news_name);
for (int i = 0; i < 8; i++) { add(categoryId[i], categoryName[i], Constant.NEWS_CHANNEL_ENABLE, i); } for (int i = 8; i < categoryId.length; i++) { add(categoryId[i], categoryName[i], Constant.NEWS_CHANNEL_DISABLE, i); } }

  这个R.array.mobile_news_id是自定义的新闻类别id

  这个R.array.mobile_news_name是自定义的新闻名称

 

2.3.添加add方法。

public boolean add(String channelId, String channelName, int isEnable, int position) {
        ContentValues values = new ContentValues();
        values.put(NewsChannelTable.ID, channelId);
        values.put(NewsChannelTable.NAME, channelName);
        values.put(NewsChannelTable.IS_ENABLE, isEnable);
        values.put(NewsChannelTable.POSITION, position);
        long result = db.insert(NewsChannelTable.TABLENAME, null, values);
        return result != -1;
    }

   这里用ContentValues整理插入数据库的数据。

 

2.4.查询方法。 

 public List<NewsChannelBean> query(int isEnable) {
        Cursor cursor = db.query(NewsChannelTable.TABLENAME, null, 
      NewsChannelTable.IS_ENABLE + "=?", new String[]{isEnable + ""}, null, null, null); List<NewsChannelBean> list = new ArrayList<>(); while (cursor.moveToNext()) { NewsChannelBean bean = new NewsChannelBean(); bean.setChannelId(cursor.getString(NewsChannelTable.ID_ID)); bean.setChannelName(cursor.getString(NewsChannelTable.ID_NAME)); bean.setIsEnable(cursor.getInt(NewsChannelTable.ID_ISENABLE)); bean.setPosition(cursor.getInt(NewsChannelTable.ID_POSITION)); list.add(bean); } cursor.close(); return list; }

 

2.5.查询所有

public List<NewsChannelBean> queryAll() {
        Cursor cursor = db.query(NewsChannelTable.TABLENAME, null, null, null, null, null, null);
        List<NewsChannelBean> list = new ArrayList<>();
        while (cursor.moveToNext()) {
            NewsChannelBean bean = new NewsChannelBean();
            bean.setChannelId(cursor.getString(NewsChannelTable.ID_ID));
            bean.setChannelName(cursor.getString(NewsChannelTable.ID_NAME));
            bean.setIsEnable(cursor.getInt(NewsChannelTable.ID_ISENABLE));
            bean.setPosition(cursor.getInt(NewsChannelTable.ID_POSITION));
            list.add(bean);
        }
        cursor.close();
        return list;
    }

 

2.6.移除所有

    public boolean removeAll() {
        int result = db.delete(NewsChannelTable.TABLENAME, null, null);
        return result != -1;
    }

 

2.7.NewsChannelDao源代码

package com.jasonjan.headnews.database.dao;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.jasonjan.headnews.R;
import com.jasonjan.headnews.bean.news.NewsChannelBean;
import com.jasonjan.headnews.database.helper.DatabaseHelper;
import com.jasonjan.headnews.database.table.NewsChannelTable;
import com.jasonjan.headnews.global.Constant;
import com.jasonjan.headnews.global.InitApp;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by JasonJan on 2017/12/4.
 */

public class NewsChannelDao {
    private SQLiteDatabase db;
    public NewsChannelDao(){
        this.db= DatabaseHelper.getDatabase();
    }

    public void addInitData(){
        String categoryId[]= InitApp.AppContext.getResources().getStringArray(R.array.mobile_news_id);
        String categoryName[]=InitApp.AppContext.getResources().getStringArray(R.array.mobile_news_name);
        for(int i=0;i<8;i++){
            add(categoryId[i], categoryName[i], Constant.NEWS_CHANNEL_ENABLE, i);
        }
        for (int i = 8; i < categoryId.length; i++) {
            add(categoryId[i], categoryName[i], Constant.NEWS_CHANNEL_DISABLE, i);
        }
    }

    public boolean add(String channelId,String channelName,int isEnable,int position){
        ContentValues values=new ContentValues();
        values.put(NewsChannelTable.ID,channelId);
        values.put(NewsChannelTable.NAME,channelName);
        values.put(NewsChannelTable.IS_ENABLE,isEnable);
        values.put(NewsChannelTable.POSITION,position);
        long result=db.insert(NewsChannelTable.TABLENAME,null,values);
        return result!=-1;
    }

    public List<NewsChannelBean> query(int isEnable) {
        Cursor cursor = db.query(NewsChannelTable.TABLENAME, null, NewsChannelTable.IS_ENABLE +
                "=?", new String[]{isEnable + ""}, null, null, null);
        List<NewsChannelBean> list = new ArrayList<>();
        while (cursor.moveToNext()) {
            NewsChannelBean bean = new NewsChannelBean();
            bean.setChannelId(cursor.getString(NewsChannelTable.ID_ID));
            bean.setChannelName(cursor.getString(NewsChannelTable.ID_NAME));
            bean.setIsEnable(cursor.getInt(NewsChannelTable.ID_ISENABLE));
            bean.setPosition(cursor.getInt(NewsChannelTable.ID_POSITION));
            list.add(bean);
        }
        cursor.close();
        return list;
    }

    public List<NewsChannelBean> queryAll() {
        Cursor cursor = db.query(NewsChannelTable.TABLENAME, null, null, null, null, null, null);
        List<NewsChannelBean> list = new ArrayList<>();
        while (cursor.moveToNext()) {
            NewsChannelBean bean = new NewsChannelBean();
            bean.setChannelId(cursor.getString(NewsChannelTable.ID_ID));
            bean.setChannelName(cursor.getString(NewsChannelTable.ID_NAME));
            bean.setIsEnable(cursor.getInt(NewsChannelTable.ID_ISENABLE));
            bean.setPosition(cursor.getInt(NewsChannelTable.ID_POSITION));
            list.add(bean);
        }
        cursor.close();
        return list;
    }

    public void updateAll(List<NewsChannelBean> list) {
    }

    public boolean removeAll() {
        int result = db.delete(NewsChannelTable.TABLENAME, null, null);
        return result != -1;
    }
}
View Code

相关文章: