安卓SQLite和SQLiteDataBase的应用

安卓实验安卓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、 现在就已经可以显示数据库中查询的数据在列表中了
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201030192316450.png#pic_cente

6、 设置点击事件,三秒过后颜色变蓝色
(1)获取当前点击列表位置,赋值给num
在这里插入图片描述

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

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

(4)在返回列表界面的时候会调用onRestart方法
在这里插入图片描述

运行截图:
前面的两个带图片的是我之前创建的两个列表,具体的列表实现是下面没有图片的![在这里插入图片描述](https://img-blog.csdnimg.cn/20201030192357559.png#pic_center![在这里插入图片描述](https://img-blog.csdnimg.cn/20201030192405172.png#pic_center![在这里插入图片描述](https://img-blog.csdnimg.cn/20201030192411829.png#pic_center
代码:
ListActivity代码:

package com.example.Work6;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import android.content.ContentValues;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ListActivity extends AppCompatActivity {
    //定义初始时间
    public static long time1;
    //定义结束时间
    public static long time2;
    //定义标志(flag),用于区分是点击的哪个标题
    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());
    }

}
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页