收藏时会判断失误,然后出现重复收藏的情况

收藏时会判断失误,然后出现重复收藏的情况

首次点击收藏时运行良好,再次点击时也能判断出已收藏。但是在上下页翻动后,判断是否收藏的机制出现异常。之后任意一篇点击收藏后再次点击收藏也能再次收藏,甚至是同篇的多次收藏。

1
MainActivity.java<br>package com.example.self_application_homework.activity;<br><br>import androidx.appcompat.app.AppCompatActivity;<br><br>import android.content.Intent;<br>import android.database.Cursor;<br>import android.database.sqlite.SQLiteDatabase;<br>import android.os.Bundle;<br>import android.util.Log;<br>import android.view.View;<br>import android.widget.Button;<br>import android.widget.ImageView;相关截图:<br>import android.widget.TextView;<br>import android.widget.Toast;<br><br>import com.example.self_application_homework.R;<br>import com.example.self_application_homework.bean.Article;<br>import com.example.self_application_homework.biz.ArticleBiz;<br>import com.example.self_application_homework.dao.ArticleDao;<br>import com.example.self_application_homework.dao.ArticleDbHelper;<br>import com.example.self_application_homework.utils.ImageLoader;<br><br>import java.io.Serializable;<br>import java.util.ArrayList;<br>import java.util.List;<br><br>public class MainActivity extends AppCompatActivity {<br><br>    private Button mBtnDeleteDb;<br><br>    private Button mBtnLastOne, mBtnCollect, mBtnNextOne;<br>    private TextView mTvMyfavourites, mTvTitle, mTvAuthor, mTvContent;<br>    private ImageView mIvAdvertise;<br><br>    // for advertisement bitmap<br>    private ImageLoader imageLoader;<br><br>    // for current page article<br>    int currentPage = 1;<br>    private ArticleBiz mArticleBiz = new ArticleBiz();<br>    private ArticleDao mArticleDao = new ArticleDao();<br>    private Article article = new Article();<br><br>    // for MyFavourites<br>    Intent itToMyFavourites = null;<br>    List<Article> articleList = new ArrayList<>();<br><br>    private static final String TAG = "MainActivity -app";<br><br>    @Override<br>    protected void onCreate(Bundle savedInstanceState) {<br>        super.onCreate(savedInstanceState);<br>        setContentView(R.layout.activity_main);<br><br>        initViewsNDatas();<br><br>        loadAdvertisement();<br><br>        loadDatas(currentPage, false);<br>    }<br><br>    private void initViewsNDatas() {<br>        mBtnLastOne = findViewById(R.id.id_btn_lastOne);<br>        mBtnCollect = findViewById(R.id.id_btn_collect);<br>        mBtnNextOne = findViewById(R.id.id_btn_nextOne);<br>        mTvMyfavourites = findViewById(R.id.id_tv_myFavourites);<br>        mTvTitle = findViewById(R.id.id_tv_title);<br>        mTvAuthor = findViewById(R.id.id_tv_author);<br>        mTvContent = findViewById(R.id.id_tv_content);<br>        mIvAdvertise = findViewById(R.id.id_iv_advertise);<br><br>        itToMyFavourites = new Intent(MainActivity.this, MyFavouritesActivity.class);<br><br>        mBtnDeleteDb = findViewById(R.id.id_btn_deleteDb);<br>    }<br><br>    public void initEvenets(View v) {<br>        switch (v.getId()) {<br>            case R.id.id_tv_myFavourites:<br>                // 打开收藏页面<br>                if (mArticleDao.loadFromDb(this).isEmpty())<br>                    Toast.makeText(this, "还没收藏任何内容", Toast.LENGTH_SHORT).show();<br>                else<br>                    startActivity(itToMyFavourites);<br>                break;<br>            case R.id.id_btn_lastOne:<br>                // 打开上一页<br>                Log.d(TAG, "currentPage: " + currentPage);<br>                loadDatas(loadPage(false), true);<br>                break;<br>            case R.id.id_btn_collect:<br>                // 点击收藏按钮<br>                List<Article> articleList = mArticleDao.loadFromDb(this);<br><br>                // 先判断收藏里(数据库)是否为空,为空直接添加数据,不为空则进一步判断<br>                if (articleList.isEmpty() || articleList == null) {<br>                    mArticleDao.insertToDb(this, article);<br>                    Toast.makeText(this, "收藏成功", Toast.LENGTH_SHORT).show();<br>                    Log.d(TAG, "articleList.isEmpty(): " + articleList.isEmpty());<br>                } else {<br>                    // 收藏中有相同的文章则跳过,否则添加巾数据库<br>                    for (Article articleInLoop : articleList) {<br>                        Log.d(TAG, "article.getTitle().equals(articleInLoop.getTitle()): " + article.getTitle().equals(articleInLoop.getTitle()));<br>                        if (article.getTitle().equals(articleInLoop.getTitle())) {<br>                            Toast.makeText(this, "此文章已收藏", Toast.LENGTH_SHORT).show();<br>                        } else {<br>                            mArticleDao.insertToDb(this, article);<br>                            Toast.makeText(this, "收藏成功", Toast.LENGTH_SHORT).show();<br>                        }<br>                    }<br>                }<br>                break;<br>            case R.id.id_btn_nextOne:<br>                // 打开下一页<br>                loadDatas(loadPage(true), true);<br>                break;<br>            case R.id.id_btn_deleteDb:<br>                // 删库<br>                mArticleDao.deleteDb(this);<br>                Toast.makeText(this, "数据库已清空", Toast.LENGTH_SHORT).show();<br>                break;<br>        }<br>    }<br><br>    private void loadAdvertisement() {<br>        imageLoader = new ImageLoader();<br>        int random = (int) (3 * Math.random() + 1);<br>        imageLoader.loadImageByAsynTask(mIvAdvertise, "http://www.imooc.com/api/teacher?type=1", random);<br>    }<br><br>    private void loadDatas(int page, boolean isUseCache) {<br>        mArticleBiz.loadDatas(new ArticleBiz.Callback() {<br>            @Override<br>            public void onSuccess(Article resultArticle) {<br>                article = resultArticle;<br>                mTvTitle.setText(article.getTitle());<br>                mTvAuthor.setText(article.getAuthor());<br>                mTvContent.setText(article.getContent());<br>            }<br><br>            @Override<br>            public void onFailure(Exception ex) {<br>                ex.printStackTrace();<br>            }<br>        }, page, isUseCache);<br>    }<br><br>    private int loadPage(boolean nextPage) {<br>        if (nextPage == true)<br>            currentPage++;<br>        else<br>            currentPage--;<br><br>        if (currentPage < 1)<br>            currentPage = 30;<br>        if (currentPage > 30)<br>            currentPage = 1;<br><br>        return currentPage;<br>    }<br><br>}<br>
1
​ArticleDao.java<br>​package com.example.self_application_homework.dao;<br><br>import android.content.ContentValues;<br>import android.content.Context;<br>import android.database.Cursor;<br>import android.database.sqlite.SQLiteDatabase;<br><br>import androidx.annotation.NonNull;<br><br>import com.example.self_application_homework.bean.Article;<br><br>import java.util.ArrayList;<br>import java.util.List;<br><br>public class ArticleDao {<br>    public List<Article> loadFromDb(@NonNull Context context) {<br><br>        ArticleDbHelper dbHelper = ArticleDbHelper.getInstance(context);<br>        SQLiteDatabase db = dbHelper.getWritableDatabase();<br><br>        List<Article> articleList = new ArrayList<>();<br><br>        Cursor cursor = db.rawQuery("SELECT * FROM " + Article.TABLE_NAME, null);<br>        Article article = null;<br>        while (cursor.moveToNext()) {<br>            int id = cursor.getInt(cursor.getColumnIndex(Article.COL_ID));<br>            String title = cursor.getString(cursor.getColumnIndex(Article.COL_TITLE));<br>            String author = cursor.getString(cursor.getColumnIndex(Article.COL_AUTHOR));<br>            String content = cursor.getString(cursor.getColumnIndex(Article.COL_CONTENT));<br>            article = new Article(title, author, content);<br>            articleList.add(article);<br>        }<br>        cursor.close();<br><br>        return articleList;<br>    }<br><br>    public void insertToDb(@NonNull Context context, Article article) {<br><br>        if (article == null) {<br>            return;<br>        }<br><br>        ArticleDbHelper dbHelper = ArticleDbHelper.getInstance(context);<br>        SQLiteDatabase db = dbHelper.getWritableDatabase();<br><br>        db.beginTransaction();<br><br>        ContentValues contentValues = null;<br>        contentValues = new ContentValues();<br>        contentValues.put(Article.COL_TITLE, article.getTitle());<br>        contentValues.put(Article.COL_AUTHOR, article.getContent());<br>        contentValues.put(Article.COL_CONTENT, article.getAuthor());<br>        db.insertWithOnConflict(Article.TABLE_NAME, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);<br><br>        db.setTransactionSuccessful();<br>        db.endTransaction();<br>    }<br><br>    public void deleteDb(@NonNull Context context) {<br>        ArticleDbHelper dbHelper = ArticleDbHelper.getInstance(context);<br>        SQLiteDatabase db = dbHelper.getWritableDatabase();<br>        db.execSQL("DELETE FROM " + Article.TABLE_NAME);<br>    }<br>}<br>

http://img1.sycdn.imooc.com//climg/604436c309f59fd204040859.jpg

http://img1.sycdn.imooc.com//climg/604436c309a64f3f13850992.jpg


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕雪 2021-03-08 09:59:34

同学,你好!同学这里的逻辑有问题

http://img1.sycdn.imooc.com//climg/6045844e0953ae2407420221.jpg

判断表中是否有此记录,是不是你得循环完毕才知道它是否已经存在呢?并不是走一条记录就能决定的。所以需要增加一个标志位,如果存在就把标志位设置为已经存在,循环完之后再判断标志位,是不是应该insertToDb()。祝:学习愉快!

  • 提问者 AgonyX #1

    http://img1.sycdn.imooc.com//climg/60458f3d095c68f607290207.jpg

    http://img1.sycdn.imooc.com//climg/60458f5509ee87ce08860495.jpg

    为什么我用这个方法也是行不通呢

    2021-03-08 10:43:46
  • 好帮手慕雪 回复 提问者 AgonyX #2

    http://img1.sycdn.imooc.com//climg/6045b7d709329bd405800188.jpg

    sql的条件连接符是什么?修改一下

    2021-03-08 13:37:27
  • 提问者 AgonyX 回复 好帮手慕雪 #3

    http://img1.sycdn.imooc.com//climg/6045b89f0988922207270231.jpg

    只是中间我怕不会有空格隔开所以加了个连接符而已,但是去掉后一样不管用

    2021-03-08 13:40:15
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.Android 网络操作与流行框架
  • 参与学习           人
  • 提交作业       220    份
  • 解答问题       1800    个

本阶段是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理;从文件存储、到轻量级数据库SQLite的使用;最后利用最流程的第三方框架助你快速开发企业级APP。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码