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();
}
}