gpt4 book ai didi

android - 如何用新数据正确覆盖 SQLite 表行?

转载 作者:行者123 更新时间:2023-11-29 01:05:32 24 4
gpt4 key购买 nike

我正在制作一个显示 10 个最新新闻标题的新闻应用程序。当 API 返回 10 篇不同的新闻文章时,将它们插入到表中而不删除当前的文章,导致数据量每次增加 10。

到目前为止,我已尝试更新行,这在表中已有数据时有效。我已尝试删除表并重新创建它,但它什么也不显示...

我找到的唯一解决方案是将虚拟数据插入表中并用来自 api 的数据覆盖它...最好的方法是什么?请看下面的代码。

数据库助手

public class dbHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME="mytube";
private static final int DATABASE_VERSION = 1;
private static final String NEWS_TABLE = "news";
private static final String CREATE_TABLE = "create table "+NEWS_TABLE +"(title TEXT, desc TEXT, url TEXT)";

Context context;

public dbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
}

@Override
public void onCreate(SQLiteDatabase db) {

db.execSQL(CREATE_TABLE);
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL("DROP TABLE IF EXISTS " + NEWS_TABLE);
// Create tables (again)
onCreate(db);
}
// Insert into DB

public void insertIntoDB(String title,String desc,String url){
Log.d("insert data", "");

// get reference to writable DB
SQLiteDatabase db = this.getWritableDatabase();

// Create ContentValues to add key
ContentValues values = new ContentValues();
values.put("title", title);
values.put("desc", desc);
values.put("url", url);


// Insert Data
db.insert(NEWS_TABLE, null, values);

// Close DB
db.close();
Toast.makeText(context, "insert value", Toast.LENGTH_LONG);
Log.i("", "Insert complete");
}
/* Retrive data from database */
public List<DatabaseModel> getDataFromDB(){
List<DatabaseModel> modelList = new ArrayList<DatabaseModel>();
String query = "select * from "+NEWS_TABLE;

SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query,null);

if (cursor.moveToFirst()){
do {
DatabaseModel model = new DatabaseModel();
model.setTitle(cursor.getString(0));
model.setDesc(cursor.getString(1));
model.setUrl(cursor.getString(2));

modelList.add(model);
}while (cursor.moveToNext());
}


// Log.d("news data", modelList.toString());


return modelList;
}




}

Activity

public class journeyEntertainment extends AppCompatActivity {

dbHelper helper;
List<DatabaseModel> dbList;
RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_journey_entertainment);
/* Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);*/

getNews();
helper = new dbHelper(this);
dbList= new ArrayList<DatabaseModel>();

dbList = helper.getDataFromDB();

mRecyclerView = (RecyclerView)findViewById(R.id.recycleview);

mRecyclerView.setHasFixedSize(true);

// use a linear layout manager
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);

// specify an adapter (see also next example)
mAdapter = new RecyclerAdapter(this,dbList);
mRecyclerView.setAdapter(mAdapter);



}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_second, menu);
return true;
}



@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}


public void getNews(){
RequestQueue queue = Volley.newRequestQueue(this);
String url = "https://newsapi.org/v2/top-headlines?sources=bbc-news&apiKey=927e06d9dddb47ee929c9bb7597777055434";

final StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray jsonArray = jsonObject.getJSONArray("articles");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jo = jsonArray.getJSONObject(i);

String title = jo.getString("title");
String desc = jo.getString("description");
String url = jo.getString("url");

title = title.replaceAll("'", "");
desc = desc.replaceAll("'", "");
url = url.replaceAll("'", "");





helper = new dbHelper(journeyEntertainment.this);
helper.insertIntoDB(title, desc, url);


}

} catch (JSONException e) {

}

}

}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {


}
});

RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
requestQueue.add(stringRequest);
}
}

最佳答案

1) 将以下方法添加到您的 dbHelper(这将删除表中的所有行);

public void removeAllRowsFromNewsTable(){
Log.d("insert data", "");

// get reference to writable DB
SQLiteDatabase db = this.getWritableDatabase();
db.delete(NEWS_TABLE,null,null);
}

2) 在您的 getNews 方法中修改:-

                    helper = new dbHelper(journeyEntertainment.this);
helper.insertIntoDB(title, desc, url);

到:-

                    helper = new dbHelper(journeyEntertainment.this);
helper.removeAllRowsFromNewsTable();
helper.insertIntoDB(title, desc, url);

关于android - 如何用新数据正确覆盖 SQLite 表行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47530895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com