Загрузка данных в начале приложения, если база данных не пуста - PullRequest
0 голосов
/ 15 октября 2019

Я сделал приложение для чтения новостей, где через его API выбираются 20 лучших новостных статей одного из ведущих новостных сайтов.

В одном действии содержится просмотр списка, в котором отображаются заголовки последних новостей, и при щелчке по ним открывается веб-просмотр в другом действии, соответствующем этой новостной статье.

Я загружаю контент через AsyncTask и onPostExecute. Я обновляю свой просмотр списка. Я хочу сделать то же самое в OnCreate, если база данных не пуста.

Я попытался проверить, если cursor.getstring (0) не ноль или! ArticleDB.equals (ноль), но не работает, и приложение вылетает при открытиив первый раз.

package com.example.freshnews;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {


    static ArrayList<String> titles=new ArrayList<>();
    static ArrayList<String> articleHtml=new ArrayList<>();
    static ArrayList<String> articleLinks=new ArrayList<>();

    ArrayAdapter<String> arrayAdapter;
    ListView newsListView;
    String articleTitle,articleUrl,result,articleId;
    SQLiteDatabase articleDB;
    Cursor c;

    public void updateListView()

    {



        c=articleDB.rawQuery("SELECT * FROM articles",null);
        int titleIndex=c.getColumnIndex("articleTitle");
        int codeIndex=c.getColumnIndex("articleCode");
        int linkIndex=c.getColumnIndex("articleLinks");

        if(c.moveToFirst())
        {
            titles.clear();
            articleHtml.clear();
            articleLinks.clear();
        }

        do {

            titles.add(c.getString(titleIndex));
            articleHtml.add(c.getString(codeIndex));
            articleLinks.add(c.getString(linkIndex));

        }while(c.moveToNext());
        c.close();
        arrayAdapter.notifyDataSetChanged();
    }



    public class DownloadTask extends AsyncTask<String,Void,String>
    {

        @Override
        protected String doInBackground(String... strings) {

            URL url;
            result="";
            HttpURLConnection urlConnection=null;

            try {
                url = new URL(strings[0]);

                urlConnection=(HttpURLConnection) url.openConnection();
                InputStream inputStream = urlConnection.getInputStream();
                InputStreamReader reader=new InputStreamReader(inputStream);
                int data=reader.read();

                while(data != -1)
                {
                    char current=(char) data;
                    result += current;
                    data=reader.read();
                }

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            //Received article IDs

            int articleCounter;

            String newsSourceURL;

            articleDB.execSQL("DELETE FROM articles");

            try {
                JSONArray jsonArray = new JSONArray(result);

                if(jsonArray.length()<20)
                {
                    articleCounter=jsonArray.length();
                }
                else
                {
                    articleCounter=20;
                }



                for(int i=0;i<articleCounter;i++)
                {
                  //  Log.i("JSON Items",jsonArray.getString(i));


                    articleId=jsonArray.getString(i);
                    newsSourceURL="https://hacker-news.firebaseio.com/v0/item/" + articleId + ".json?print=pretty";
               //     Log.i("URL",newsSourceURL);

                    url=new URL(newsSourceURL);
                    urlConnection=(HttpURLConnection) url.openConnection();
                    InputStream inputStream=urlConnection.getInputStream();
                    InputStreamReader reader=new InputStreamReader(inputStream);
                    int data=reader.read();

                    String articleInfo="";

                    while(data!=-1)
                    {
                        char current=(char) data;
                        articleInfo+=current;
                        data=reader.read();
                    }

                    JSONObject jsonObject=new JSONObject(articleInfo);

                    if(!jsonObject.isNull("title") && !jsonObject.isNull("url")) {
                        articleTitle = jsonObject.getString("title");
                        articleUrl = jsonObject.getString("url");
                    }
                //    Log.i("Article Information",articleId + "   " + articleTitle + "   " + articleUrl);

                  /*  URL urlHtml=new URL(articleUrl);
                    HttpURLConnection urlConnectionHtml=(HttpURLConnection) urlHtml.openConnection();
                    InputStream inputStreamHtml=urlConnectionHtml.getInputStream();
                    InputStreamReader readerHtml=new InputStreamReader(inputStreamHtml);
                    int dataHtml=readerHtml.read();


                    while(dataHtml<50)
                    {
                        char current=(char) dataHtml;
                        articleCode+=current;
                        dataHtml=readerHtml.read();

                    }
                    Log.i("Article HTML",articleCode);*/

                    String articleCode="<html><body><h1>Hi There</h1><p>How did you find my webview?</p></body></html>";


                    String sql="INSERT INTO articles (articleId,articleTitle,articleCode,articleLinks) VALUES (?, ?, ?, ?)";

                    SQLiteStatement statement=articleDB.compileStatement(sql);
                    statement.bindString(1,articleId);
                    statement.bindString(2,articleTitle);
                    statement.bindString(3,articleCode);
                    statement.bindString(4,articleUrl);

                    statement.execute();

                }


            } catch (JSONException e) {
                e.printStackTrace();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

            updateListView();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        newsListView=(ListView) findViewById(R.id.newsListView);
        arrayAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,titles);
        newsListView.setAdapter(arrayAdapter);

        newsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Intent intent = new Intent(getApplicationContext(),NewsActivity.class);
                intent.putExtra("news",articleLinks.get(position));
                startActivity(intent);

            }
        });

        articleDB=this.openOrCreateDatabase("Articles",MODE_PRIVATE,null);
        articleDB.execSQL("CREATE TABLE IF NOT EXISTS articles (id INTEGER PRIMARY KEY, articleId INTEGER, articleTitle VARCHAR, articleCode VARCHAR, articleLinks VARCHAR) ");
       /* if(!c.moveToFirst()) {            Facing the problem here

            updateListView();
        }*/
        DownloadTask task=new DownloadTask();

        try {
            task.execute("https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty");

        }catch (Exception e)
        {
            e.printStackTrace();
        }

    }
}

1 Ответ

0 голосов
/ 15 октября 2019

/ * if (! C.moveToFirst ()) {Здесь возникает проблема

Вы столкнетесь с такой же проблемой, как курсор будет нулевым, так как он не был создан.

Добавьте строку

c = articleDB.rawQuery("SELECT count() FROM articles LIMIT 1",null);

, и вместо вышесказанного вы можете использовать более показательные: -

if (c.getCount() < 1) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...