安卓实验安卓SQLite和SQLiteDataBase的应用
1、 先将数据写入两个news对象中,方便一会插入数据库,这里定义了一个SetNews类,里面静态方法是插入两条数据到news对象中并返回插入之后的对象

2、重写SQLiteOpenHelper类,以使第一次加载时能创建数据库及表。这里定义了一个MySQLiteHelper类,通过父类的构造方法创建数据库,版本为1;然后重写onCreate方法创建表。

2、 在ListActivity加载时,向数据库中插入两条数据。
(1)首先定义insert方法,方便以后插入数据。

(2)插入数据

3、 插入数据之后读取数据
(1)首先定义一个读取数据库数据的方法

(2)调用方法

4、 将查询到的数据显示到ListView列表中
(1)首先在实验四基础上定义一个ListView,定义id属性

(2)自定义一个布局文件,用于listView加载布局文件,布局如下图

(3)定义一个Map集合,将查出来的数据依次装进map集合

(4)定义适配器并setAdapter

5、 现在就已经可以显示数据库中查询的数据在列表中了
获取当前点击列表位置,赋值给num

(2)当返回列表界面的时候,如果时间超过3秒,就将当前列表的位置写进XML文件中,首先定义将num写入文件的方法

(3)定义改变颜色的方法,此时需要将写入文件的num读出来,然后通过ListView中的getChildAt方法获取点击过的列表,然后将列表变色,这里用到处理字符串的一些方法

(4)在返回列表界面的时候会调用onRestart方法

运行截图:
前面的两个带图片的是我之前创建的两个列表,具体的列表实现是下面没有图片的,用于区分是点击的哪个标题
private String flag;
String num;
TextView text11 = null;
TextView text21 = null;
static String t1;
static String t2;
static String t3;
static String t4;
//用于存储点击过的列表(list)编号
final static List<String> listnum = new ArrayList<String>();
List<Map<String, Object>> listitems = new ArrayList<Map<String, Object>>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
setContentView(R.layout.activity_list);
text11 = (TextView) findViewById(R.id.Text1);
TextView text12 = (TextView) findViewById(R.id.TextView2);
TextView text13 = (TextView) findViewById(R.id.TextView3);
text21 = (TextView) findViewById(R.id.TextView21);
TextView text22 = (TextView) findViewById(R.id.TextView22);
TextView text23 = (TextView) findViewById(R.id.TextView23);
//定义一个对象数组,长度为2
final News[] news0 = new News[2];
News[] news = new News[2];
//对象初始化
news0[0] = new News();
//通过SetNews类向news[0]和news[1]赋值
news[0] = SetNews.setNews(news0[0], 0);
news0[1] = new News();
news[1] = SetNews.setNews(news0[1], 1);
//初始化数据库,插入数据
this.insert(news[0].getTitle(), news[0].getSource(), news[0].getTime(), news[0].getContent());
this.insert(news[1].getTitle(), news[1].getSource(), news[1].getTime(), news[1].getContent());//读取数据库文件
final List<News> list = query(); //查询出数据库的数据,并将返回值赋值给list集合
//在ListActivity加载时候给各个TextView赋值
text11.setText(list.get(0).getTitle());
text12.setText(list.get(0).getSource());
text13.setText(list.get(0).getTime());
text21.setText(list.get(1).getTitle());
text22.setText(list.get(1).getSource());
text23.setText(list.get(1).getTime());
ListView listview = (ListView) findViewById(R.id.list); //通过id找到ListView
//创建map集合
init(list);
//创建适配器
SimpleAdapter adapter = new SimpleAdapter(this, listitems, R.layout.layout, new String[]{"标题", "来源", "时间"}, new int[]{R.id.TextView1, R.id.TextView2, R.id.TextView3});
//设置适配器
listview.setAdapter(adapter);
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
num = String.valueOf(position); //获取当前点击的列表位置编号
time1 = System.currentTimeMillis(); //获取当前系统时间
Intent intent = new Intent(ListActivity.this, DetailActivity.class);
intent.putExtra("News", list.get(position)); //向详情界面传送数据
startActivity(intent); //开启详情界面
}
});
text11.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取系统当前时间赋值给time1
//time1 = System.currentTimeMillis();
//修改flag值
flag = "n1";
t1 = list.get(0).getTitle();
t2 = list.get(0).getSource();
t3 = list.get(0).getTime();
t4 = list.get(0).getContent();
Configuration mConfiguration = ListActivity.this.getResources().getConfiguration();
int ori = mConfiguration.orientation;
if (ori == mConfiguration.ORIENTATION_LANDSCAPE) {
Toast.makeText(ListActivity.this, "现在是横屏", Toast.LENGTH_LONG).show();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment fragment = new DetailFragment();
fragmentTransaction.commit();
fragmentTransaction.replace(R.id.fragment, fragment);
} else if (ori == mConfiguration.ORIENTATION_PORTRAIT) {
//初始化Intent
Intent intent = new Intent(ListActivity.this, DetailActivity.class);
//携带参数(一个对象)传入DetailActivity
intent.putExtra("News", list.get(0));
//打开指定Activity
startActivity(intent);
}
}
});
text21.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
t1 = list.get(1).getTitle();
t2 = list.get(1).getSource();
t3 = list.get(1).getTime();
t4 = list.get(1).getContent();
//原理同上
time1 = System.currentTimeMillis();
flag = "n2";
Configuration mConfiguration = ListActivity.this.getResources().getConfiguration();
int ori = mConfiguration.orientation;
if (ori == mConfiguration.ORIENTATION_LANDSCAPE) {
Toast.makeText(ListActivity.this, "现在是横屏", Toast.LENGTH_LONG).show();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment fragment = new DetailFragment();
fragmentTransaction.commit();
fragmentTransaction.replace(R.id.fragment, fragment);
} else if (ori == mConfiguration.ORIENTATION_PORTRAIT) {
//初始化Intent
Intent intent = new Intent(ListActivity.this, DetailActivity.class);
//携带参数(一个对象)传入DetailActivity
intent.putExtra("News", list.get(1));
//打开指定Activity
startActivity(intent);
}
}
});
}
public void insert(String Title, String Source, String Time, String Content) {
Log.d("插入数据库", "插入成功");
MySQLiteHelper myHelper = new MySQLiteHelper(ListActivity.this);
SQLiteDatabase db1 = myHelper.getWritableDatabase();//获得数据库写的权限
ContentValues values = new ContentValues(); //创建ContentValues对象
values.put("Title", Title); //向ContentValues对象中添加键值对,其中键对应数据库中的列名
values.put("Source", Source);
values.put("Time", Time);
values.put("Content", Content);
db1.insert("NewsTable", null, values);//调用SQLiteDatabase对象的insert方法插入数据
}
public List<News> query() {
MySQLiteHelper mySQLiteHelper = new MySQLiteHelper(ListActivity.this);
SQLiteDatabase db = mySQLiteHelper.getReadableDatabase();
//获取游标,游标移动代表下一行数据
Cursor cursor = db.query("NewsTable", null, null, null, null, null, null);
List<News> list = new ArrayList<>();
if (cursor != null) {
for (int i = 0; i < cursor.getCount(); i++) {
//游标移动到下一行
while (cursor.moveToNext()) {
//获得数据,并调用News类的构造方法创建news1对象
News news1 = new News(cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4));
list.add(news1); //将news1对象添加到News的list集合中
}
}
}
db.close();
return list; //返回list集合
}
private void init(List<News> list) {
for (int i = 0; i < list.size(); i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("标题", list.get(i).getTitle());
map.put("来源", list.get(i).getSource());
map.put("时间", list.get(i).getTime());
listitems.add(map);
}
}
@Override
protected void onRestart() {
super.onRestart();
//获取系统当前时间
time2 = System.currentTimeMillis();
//调用函数,若达到规定浏览时间,则将该新闻的position序号添加进浏览新闻的listnum中,然后存进XML文件中
getAlRead();
//判断列表是否被浏览,如果被浏览,将颜色变为蓝色
changColor();
}
private void getAlRead() {
//达到规定阅读时间,则将新闻ID存入文件
if ((time2 - time1) / 1000 > 3) {
SharedPreferences.Editor editor = getSharedPreferences("AlRead", MODE_PRIVATE).edit();
listnum.add(num);
//将已读新闻ID转化为字符串保存
String str = "";
for (int i = 0; i < listnum.size(); i++) {
str += listnum.get(i) + ",";
}
editor.putString("listnum", str);
editor.apply();
}
}
public void changColor() {
//如果文件存在,则将文件中的列表序号所在列表变为蓝色
File xml = new File("data/data/com.example.Work6/shared_prefs", "AlRead.xml");
if (xml.exists()) {
SharedPreferences sharedPreferences = getSharedPreferences("AlRead", MODE_PRIVATE);
String str = sharedPreferences.getString("listnum", "");
String[] split = str.split(",");
for (int i = 0; i < split.length; i++) {
//获得子item的layout
ListView listview = (ListView) findViewById(R.id.list);
LinearLayout layout = (LinearLayout) listview.getChildAt(Integer.parseInt(split[i]));
TextView textRead = (TextView) layout.findViewById(R.id.TextView1);
textRead.setTextColor(Color.BLUE);
}
}
}
}
MySQLiteHelper代码
package com.example.Work6;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class MySQLiteHelper extends SQLiteOpenHelper {
public MySQLiteHelper(Context context) {
super(context, "demo.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d("执行数据库操作","创建数据库表");
String createTable = "create table if not exists NewsTable(" +
"nID Integer primary key AUTOINCREMENT," +
"Title text(50) not null," +
"Source text(50) not null," +
"Time text(10) not null," +
"Content text(100) not null" +
")";
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
SetNews代码
package com.example.Work6;
public class SetNews {
//插入两条数据
public static News setNews(News news,int flag){
if(flag==0){
news.setTitle("美国务院试图将中国蚂蚁集团列入黑名单,外交部回应");
news.setSource("来源:澎湃新闻");
news.setContent("10月15日,外交部发言人赵立坚主持例行记者会。有记者提问,有媒体报道称,美国国务院正试图将中国蚂蚁集团列入黑名单。外交部对此有何评论?\n" +
"赵立坚表示,中方一贯反对美国泛化国家安全概念,滥用国家力量,无理打压外国企业的霸权行径。美方应切实尊重市场经济和公平竞争原则,遵守国际经贸规则,为各国企业在美国投资经营提供开放、公平公正、非歧视的营商环境。中方将继续采取必要措施,维护中国企业的正当权益。");
news.setTime("2020-10-15 15:50");
}else if(flag==1){
news.setTitle("淘宝台湾:今起陆续关闭下单等前台功能,年底停止运营");
news.setSource("来源:澎湃新闻");
news.setContent("据台湾“中央社”等岛内媒体10月15日报道称,经营淘宝台湾的克雷达公司发布声明表示,将在12月31日晚间23时59分后,停止在台湾的营运,淘宝台湾于10月15日上午11时起关闭平台下单等功能。\n" +
"澎湃新闻(www.thepaper.cn)10月15日查询发现,淘宝台湾网首页已发布了“淘宝台湾营运计划调整公告”(以下简称“公告”)。\n" +
"公告称:淘宝台湾平台在台落地服务近一年,感谢所有消费者这段时间的支持与爱护。本公司经慎重评估后,决定于2020年10月15日早上11:00起,陆续关闭淘宝台湾平台下单等前台功能,平台其他服务(如:电子货币包提领、官方物流、客服中心等)仍持续运作至2020年12月31日,随后正式下线。");
news.setTime("2020-10-15 12:58");
}
return news;
}
}
News.java代码
package com.example.Work6;
import java.io.Serializable;
public class News implements Serializable {
public String title;
public String content;
public String Source;
public String Time;
public News() {
}
public News(String title, String source, String time,String content) {
this.title = title;
this.content = content;
Source = source;
Time = time;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getSource() {
return Source;
}
public void setSource(String source) {
Source = source;
}
public String getTime() {
return Time;
}
public void setTime(String time) {
Time = time;
}
}
DetailActivity代码
package com.example.Work6;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class DetailActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
Intent intent=getIntent();
News news=(News)intent.getSerializableExtra("News");
TextView text1 = (TextView) findViewById(R.id.ftext1);
TextView text2 = (TextView) findViewById(R.id.ftext2);
TextView text3 = (TextView) findViewById(R.id.ftext3);
TextView text4 = (TextView) findViewById(R.id.ftext4);
text1.setText(news.getTitle());
text2.setText(news.getSource());
text3.setText(news.getTime());
text4.setText(news.getContent());
}
}

2341

被折叠的 条评论
为什么被折叠?



