2017-05-17 8 views
0

rssフィード(jsonリクエスト)を新しいsqlliteデータベースに保存して、リストビューで表示します。どんな助けにも大いに役立つでしょう。ログを持っているrssフィードをデータベースに保存してリストビューに表示することはできません

05-17 15:30:19.971 16775-16775/com.example.buh.rssfeed E/AndroidRuntime:FATAL EXCEPTION:mainプロセス:com.example.buh.rssfeed、PID:16775 java.lang .RuntimeException:アクティビティを開始できません。ComponentInfo {com.example.buh.rssfeed/com.example.buh.rssfeed.MainActivity}:java.lang.IllegalStateException:行0、列5をCursorWindowから読み取れませんでした。カーソルがデータにアクセスする前に、カーソルが正しく初期化されていることを確認してください。 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2436)android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2498)android.app.ActivityThread.access $ 900(ActivityThread.java:179)android.appにあります。 .ActivityThread $ H.handleMessage(ActivityThread.java:1324)android.os.Handler.dispatchMessage(Handler.java:102)android.os.Looper.loop(Looper.java:146)android.app.ActivityThreadにあります。 main(ActivityThread.java:5641)at java.lang.reflect.Method.invokeNative(ネイティブメソッド)java.lang.reflect.Method.invoke(Method.java:515)at com.android.internal.os.ZygoteInit $ dalvik.system.NativeStart.main(ネイティブメソッド)のcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:1104)のMethodAndArgsCaller.run(ZygoteInit.java:1288)によって引き起こされる:jav a.lang.IllegalStateException:行0、列5をCursorWindowから読み取ることができませんでした。カーソルがデータにアクセスする前に、カーソルが正しく初期化されていることを確認してください。 com.example.buh.rssfeedのandroid.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)のandroid.database.CursorWindow.nativeGetString(ネイティブメソッド)android.database.CursorWindow.getString(CursorWindow.java:439) .FeedDBHelper.cursorToItem(FeedDBHelper.java:62)com.example.buh.rssfeed.FeedDBHelper.getArticleList(FeedDBHelper.java:47)at com.example.buh.rssfeed.MainActivity.onCreate(MainActivity.java:54)at android.app.ActivityThreadのandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2400)のandroid.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)のandroid.app.Activity.performCreate(Activity.java:5484) .handleLaunchActivity(ActivityThread.java:2498)android.app.ActivityThread.access $ 900(ActivityThread.java:179) android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1324)android.os.Handler.dispatchMessage(Handler.java:102)android.os.Looper.loop(Looper.java:146)at android。 com.android.internalのjava.lang.reflect.Method.invoke(Method.java:515)のjava.lang.reflect.Method.invokeNative(ネイティブメソッド)のapp.ActivityThread.main(ActivityThread.java:5641)。 dalvik.system.NativeStart.mainでcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:1104)でos.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1288)(ネイティブメソッド)

私コード

public class FeedContract { 
private FeedContract() { 
} 

public static final String CONTENT_AUTHORITY = "com.example.buh.rssfeed"; 

public static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY); 

private static final String PATH_ENTRIES = "articles"; 

public static class Entry implements BaseColumns { 

    public static final String CONTENT_TYPE = 
      ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd.rssfeed.articles"; 

    public static final String CONTENT_ITEM_TYPE = 
      ContentResolver.CURSOR_ITEM_BASE_TYPE + "/vnd.rssfeed.article"; 

    public static final Uri CONTENT_URI = 
      BASE_CONTENT_URI.buildUpon().appendPath(PATH_ENTRIES).build(); 

    public static final String TABLE_NAME = "article"; 



    public static final String COLUMN_NAME_TITLE = "title"; 

    public static final String COLUMN_NAME_DESCRIPTION = "description"; 

    public static final String COLUMN_NAME_AUTHOR = "author"; 

    public static final String COLUMN_NAME_DATETIME = "datetime"; 

    public static final String COLUMN_NAME_URL = "url"; 


} 

}

public class FeedDBHelper { 
FeedDatabase openHelper; 
NewsItem item; 
private SQLiteDatabase db; 
private String [] columnItemName = {FeedContract.Entry.COLUMN_NAME_TITLE, 
    FeedContract.Entry.COLUMN_NAME_DESCRIPTION,   FeedContract.Entry.COLUMN_NAME_AUTHOR, 
    FeedContract.Entry.COLUMN_NAME_DATETIME, FeedContract.Entry.COLUMN_NAME_URL}; 
public FeedDBHelper(Context context) { 
    openHelper = new FeedDatabase(context); 
    db = openHelper.getWritableDatabase(); 
} 
public void saveArticleItem(String title, String description, String author, String datetime, String url){ 
    ContentValues cv = new ContentValues(); 
    // cv.put(FeedContract.Entry.COLUMN_NAME_IMAGE, image); 
    cv.put(FeedContract.Entry.COLUMN_NAME_TITLE, title); 
    cv.put(FeedContract.Entry.COLUMN_NAME_DESCRIPTION, description); 
    cv.put(FeedContract.Entry.COLUMN_NAME_AUTHOR, author); 
    cv.put(FeedContract.Entry.COLUMN_NAME_DATETIME, datetime); 
    cv.put(FeedContract.Entry.COLUMN_NAME_URL, url); 
    db.insert(FeedContract.Entry.TABLE_NAME, null, cv); 
} 
public void close() { 
    db.close(); 
} 
public ArrayList<NewsItem> getArticleList() { 
     ArrayList<NewsItem> items = new ArrayList<NewsItem>(); 
     Cursor cursor = db.query(FeedContract.Entry.TABLE_NAME, 
       columnItemName, null, null, null, null, null); 
     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) { 
      NewsItem item = cursorToItem(cursor); 
      items.add(item); 
      cursor.moveToNext(); 
     } 
     // make sure to close the cursor 
     cursor.close(); 
     return items; 
    } 
    private NewsItem cursorToItem(Cursor cursor) { 
     NewsItem item = new NewsItem(); 
     item.setNewsHeading(cursor.getString(1)); 
     item.setNewsDescSmall(cursor.getString(2)); 
     item.setAuthor(cursor.getString(3)); 
     item.setDateTime(cursor.getString(4)); 
     item.setUrl(cursor.getString(5)); 
     return item; 
    } 
static class FeedDatabase extends SQLiteOpenHelper { 
    public static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_NAME = "feed.db"; 
    private static final String TYPE_TEXT = " TEXT"; 
    private static final String TYPE_INTEGER = " INTEGER"; 
    private static final String TYPE_BLOB = " BLOB NOT NULL"; 
    private static final String COMMA_SEP = ","; 
    private static final String SQL_CREATE_ARTICLES = 
      "CREATE TABLE " + FeedContract.Entry.TABLE_NAME + " (" + 
        FeedContract.Entry._ID + " INTEGER PRIMARY KEY," + 
        FeedContract.Entry.COLUMN_NAME_TITLE + TYPE_TEXT + COMMA_SEP + 
        FeedContract.Entry.COLUMN_NAME_DESCRIPTION + TYPE_TEXT + COMMA_SEP + 
        FeedContract.Entry.COLUMN_NAME_AUTHOR + TYPE_TEXT + COMMA_SEP + 
        FeedContract.Entry.COLUMN_NAME_DATETIME + TYPE_TEXT + COMMA_SEP + 
        FeedContract.Entry.COLUMN_NAME_URL + TYPE_TEXT + ")"; 
    private static final String SQL_DELETE_ARTICLES = 
      "DROP TABLE IF EXISTS " + FeedContract.Entry.TABLE_NAME; 
    public FeedDatabase(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(SQL_CREATE_ARTICLES); 
    } 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL(SQL_DELETE_ARTICLES); 
     onCreate(db); 
    } 
} 

}

public class NewsItem { 

private String newsHeading; 
private String newsDesc; 
private String author; 
private String dateTime; 
private String url; 
public void setNewsHeading(String newsHeading) { 
    this.newsHeading = newsHeading; 
} 
public void setNewsDesc(String newsDesc) { 
    this.newsDesc = newsDesc; 
} 
public void setAuthor(String author) { 
    this.author = author; 
} 
public void setDateTime(String dateTime) { 
    this.dateTime = dateTime; 
} 
public void setNewsDescSmall(String newsDescSmall) { 
    this.newsDescSmall = newsDescSmall; 
} 
public void setUrl(String url) { 
    this.url = url; 
} 
private String newsDescSmall; 
public NewsItem() { 
} 
public NewsItem(String newsHeading, String newsDesc, String author, String dateTime, String url) { 
    this.newsHeading = newsHeading; 
    this.newsDesc = newsDesc; 
    this.author = author; 
    this.dateTime = dateTime; 
    this.url = url; 
    this.newsDescSmall = this.newsDesc.substring(0, 19) + "..."; 
} 
public String getNewsDesc() { 
    return newsDesc; 
} 
public String getAuthor() { 
    return author; 
} 
public String getNewsHeading() { 
    return newsHeading; 
} 
public String getDateTime() { 
    return dateTime; 
} 
public String getUrl() { 
    return url; 
} 
public String getNewsDescSmall() { 
    return newsDescSmall; 
} 

}

public class MainActivity extends AppCompatActivity { 

private static final String TAG_TITLE = "title"; 
private static final String TAG_DESCRIPTION = "description"; 
private static final String TAG_AUTHOR = "author"; 
private static final String TAG_PUBLISHEDAT = "publishedAt"; 
private static final String TAG_URL = "url"; 
CustomAdapter adapter; 
Context ctx; 
private List<NewsItem> newsFeed = new ArrayList<>(); 
FeedDBHelper feedDBHelper; 
ListView lv; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    feedDBHelper = new FeedDBHelper(this); 
    lv = (ListView) findViewById(R.id.list); 
    jsonParser(); 
newsFeed = feedDBHelper.getArticleList(); 
    addClickListener(); 
    adapter = new CustomAdapter(); 
    lv.setAdapter(adapter); 
} 
public void jsonParser() { 
    RequestQueue queue = Volley.newRequestQueue(this); 
    final JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, "https://newsapi.org/v1/articles?source=the-next-web&sortBy=latest&apiKey=264e1f7afdff497aaaa6458de9bab1de", 
      null, new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      try { 
       JSONArray articlesItem = response.getJSONArray("articles"); 
       for (int i = 0; i < articlesItem.length(); i++) { 
        JSONObject item = articlesItem.getJSONObject(i); 
        String title = item.getString(TAG_TITLE); 
        String description = item.getString(TAG_DESCRIPTION); 
        String author = item.getString(TAG_AUTHOR); 
        String dateTime = item.getString(TAG_PUBLISHEDAT); 
        String url = item.getString(TAG_URL); 
        Log.e("my", title+ " " + description + " " + author + " " + dateTime+ " "+url); 
        feedDBHelper.saveArticleItem(title, description, author, dateTime, url); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.e("mylog", error.toString()); 
     } 
    }); 
    request.setRetryPolicy(new DefaultRetryPolicy(
      5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT 
    )); 
    queue.add(request); 
} 
private void addClickListener() { 
    lv = (ListView) findViewById(R.id.list); 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() 
           { 
            @Override 
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
             NewsItem currentItem = newsFeed.get(i); 
             Intent intent = new Intent(Intent.ACTION_VIEW); 
             intent.setData(Uri.parse(currentItem.getUrl())); 
             startActivity(intent); 
            } 
           } 
    ); 
} 
public class CustomAdapter extends ArrayAdapter<NewsItem> { 
    private CustomAdapter() { 
     super(MainActivity.this, R.layout.item_list, newsFeed); 
    } 
    @Override 
    @NonNull 
    @SuppressWarnings("NullableProblems") 
    public View getView(int position, View convertView, ViewGroup parent) { 
     MyViewHolder mViewHolder; 
     if (convertView == null) { 
      convertView = getLayoutInflater().inflate(R.layout.item_list, parent, false); 
      mViewHolder = new MyViewHolder(convertView); 
      convertView.setTag(mViewHolder); 
     } else { 
      mViewHolder = (MyViewHolder) convertView.getTag(); 
     } 
     NewsItem currentItem = newsFeed.get(position); 
     mViewHolder.heading.setText(currentItem.getNewsHeading()); 
     mViewHolder.desc.setText(currentItem.getNewsDescSmall()); 
     mViewHolder.author.setText(currentItem.getAuthor()); 
     mViewHolder.date.setText(currentItem.getDateTime()); 
     mViewHolder.url.setText(currentItem.getUrl()); 
     return convertView; 
    } 
    private class MyViewHolder { 
     TextView heading, desc, author, date, url ; 
     private MyViewHolder(View item) { 
      heading = (TextView) item.findViewById(R.id.heading); 
      desc = (TextView) item.findViewById(R.id.desc); 
      author = (TextView) item.findViewById(R.id.author); 
      date = (TextView) item.findViewById(R.id.datetime); 
      url = (TextView) item.findViewById(R.id.url); 
     } 
    } 
} 
@Override 
protected void onPause() { 
feedDBHelper.close(); 
    super.onPause(); 
} 
@Override 
protected void onResume() { 
    super.onResume(); 
    feedDBHelper = new FeedDBHelper(this); 
    addClickListener(); 
} 

}

答えて

0

正しく理解することができた場合は、利用可能なデータがある場合、またはあなたがチェックする前に、データを取得しようない。

ですから、次

while (cursor.moveToNext()) { 
    NewsItem item = cursorToItem(cursor); 
    items.add(item); 
    } 
この

while (!cursor.isAfterLast()) { 
      NewsItem item = cursorToItem(cursor); 
      items.add(item); 
      cursor.moveToNext(); 
     } 

を交換しようとすることができますしてください

関連する問題