安卓开发4——SQLite和SQLiteDatabase应用

本实验在“安卓开发2”实验基础上进行:安卓开发2——碎片Fragment的使用

 

目录

一、实验内容:

二、实验过程:

三、代码


一、实验内容:

1、设计一个新闻数据库,包含一个新闻表:

          表名:NewsTable

字段名

数据类型

约束

说明

nID

integer

主键,自增

新闻ID

Title

text

 

标题

Content

text

 

内容

Source

text

 

来源

time

text

 

发布时间

imageSource int   新闻图片的地址来源

2、重写SQLiteOpenHelper类,以使第一次加载时能创建数据库及表,并insert几条初始新闻;当ListActivity加载时,读取数据库中的信息,并创建News对象序列并将数据库中的记录写入,其他程序逻辑可不修改。

3、修改新闻列表,以ListView实现,或在Layout中动态生成TextView实现,使得新闻列表可根据数据库中新闻条数多少而增减。

4、使用SharedPreferences保存已看过的新闻ID,下次再进入时,以灰色显示。

二、实验过程:

1、新建CreateNewDB类继承SQLiteOpenHelper,重写其中的方法。该类用于创建数据库,数据库中包含一张表,表名为NewsTable。

                            安卓开发4——SQLite和SQLiteDatabase应用_第1张图片

2、在ListActivity活动第一次创建时进行数据库的创建,数据库名为News.db,随后插入三则新闻数据在表中。接着从表中读出新闻数据,利用cursor.getCount()获取新闻条数,再创建相应数目的News[]数组,最后把每条news[i]添加进lstNews中,用于后面自定义适配器。

安卓开发4——SQLite和SQLiteDatabase应用_第2张图片

                              安卓开发4——SQLite和SQLiteDatabase应用_第3张图片

3、自定义适配器MyAdapter继承ArrayAdapter,该适配器可通过泛型来指定要适配的数据类型(该处数据类型为News),然后将数据直接传递给ListView。往MyAdapter中传入的布局R.layout.news_item为ListView中每一子项的布局。

                                安卓开发4——SQLite和SQLiteDatabase应用_第4张图片

                                

                                                          安卓开发4——SQLite和SQLiteDatabase应用_第5张图片

4、getAlRead()方法的功能为判断新闻是否达到阅读时间,若是,则将新闻ID添加进lstID,并将该lstID中的数据转成以“,”相间的字符串,最后将字符串以SharePreferences的方式进行保存。

changeColor()方法的功能为利用SharePreferences方法读取之前保存的字符串,再利用split()方法获取到已读新闻的ID,最后将已读新闻置灰。这两个方法都在ListActivity的onStart中调用。

                               安卓开发4——SQLite和SQLiteDatabase应用_第6张图片

                          安卓开发4——SQLite和SQLiteDatabase应用_第7张图片

                                                                                         下面是程序运行结果:

安卓开发4——SQLite和SQLiteDatabase应用_第8张图片       安卓开发4——SQLite和SQLiteDatabase应用_第9张图片         安卓开发4——SQLite和SQLiteDatabase应用_第10张图片

三、代码

ListActivity.java

public class ListActivity extends AppCompatActivity {

    private CreateNewsDB createNewsDB;
    //接收进入和退出DetailActivity的时间
    static long ttime1=0;
    static long ttime2=0;

    //用于记录新闻条数
     int count=0;
    //用于记录被点击的行号
    String number;

    ListView listView;

    //用于记录被点击的新闻的标题、来源、时间、内容
    static String myTitle;
    static String mySource;
    static String myTime;
    static String myContent;
    //用于承装浏览过的新闻ID
    static List lstID=new ArrayList();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        //创建一个“AlRead”文件,现在里面放一个“,”
        SharedPreferences.Editor editor = getSharedPreferences("AlRead", MODE_PRIVATE).edit();
        editor.putString("data", ",");
        editor.apply();

        //创建数据库
        createNewsDB=new CreateNewsDB(this,"News.db",null,5);
        SQLiteDatabase db=createNewsDB.getWritableDatabase();
        //插入数据
        ContentValues values=new ContentValues();
        values.put("Title","写在习近平总书记考察曲阜五周年之际");
        values.put("Content","五年前的11月26日,历史的高光时刻聚焦在孔子故里——山东曲阜。这一天,习近平总书记来到这里考察," +
                "发表重要讲话强调,一个国家、一个民族的强盛,总是以文化兴盛为支撑的,中华民族伟大复兴需要以中华文化发展繁荣为条件。");
        values.put("Source","新浪网");
        values.put("time","2018/11/25");
        values.put("imageSource",R.drawable.xijinping);
        db.insert("NewsTable",null,values);
        values.clear();

        values.put("Title","蔡英文辞去民进党党主席意味着什么?");
        values.put("Content","11月24日,台湾举行“九合一”选举。当日晚间传来重磅消息,民进党大败," +
                "蔡英文宣布辞去民进党主席职务,以示对该党在台湾地区“九合一”选举中的表现负责。");
        values.put("Source","搜狐网");
        values.put("time","2018/11/25");
        values.put("imageSource",R.drawable.cai);
        db.insert("NewsTable",null,values);
        values.clear();

        values.put("Title","支付宝蚂蚁森林初见雏形,“绿色能量”你贡献了多少?");
        values.put("Content","相信许多的小伙伴手机上都是有支付宝的吧,支付宝里面有一个蚂蚁森林,许多的小伙伴都是很喜欢玩蚂蚁森林的," +
                "但有一些小伙伴不知道蚂蚁森林主要是干什么的,骑士蚂蚁森林主要就是在沙漠里面种树,而我们在蚂蚁森林这个应用玩游戏,也其实也就是做慈善的。");
        values.put("Source","腾讯网");
        values.put("time","2018/11/25");
        values.put("imageSource",R.drawable.mayun);
        db.insert("NewsTable",null,values);
        values.clear();

        //lstNews用于承载每条新闻
        List lstNews=new ArrayList();
        //游标查询数据库内容
        Cursor cursor=db.query("NewsTable",null,null,null,null,null,null);
        //获取总共多少条新闻
        count=cursor.getCount();
        int i=0;
        //新闻数组
        final News[] news=new News[count];
        if(cursor.moveToFirst())
        {
            do{
                //获取数据值
                int id=cursor.getInt(cursor.getColumnIndex("nlID"));
                String title=cursor.getString(cursor.getColumnIndex("Title"));
                String content=cursor.getString(cursor.getColumnIndex("Content"));
                String source=cursor.getString(cursor.getColumnIndex("Source"));
                String time=cursor.getString(cursor.getColumnIndex("time"));
                int imageSource=cursor.getInt(cursor.getColumnIndex("imageSource"));
                //将每组值重组为一则新闻news[i]
                news[i]=new News();
                news[i].setId(String.valueOf(id));
                news[i].setTitle(title);
                news[i].setContent(content);
                news[i].setSource(source);
                news[i].setTime(time);
                news[i].setImageSource(imageSource);
                //将每条新闻存入lstNews
                lstNews.add(news[i]);
                i++;
            }while(cursor.moveToNext());
        }

        class MyAdapter extends ArrayAdapter{
            //每行新闻的布局
            private int resourceId;
            public MyAdapter(Context context, int resource, List objects) {
                super(context, resource, objects);
                resourceId=resource;
            }
            @NonNull
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                //获取当前项的实例
                News myNew=getItem(position);
                //利用convertView缓存提高ListView效率
                View view;
                if(convertView==convertView)
                {
                    view=LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
                }else
                {
                    view=convertView;
                }
                //获取对应控件实例并赋值
                TextView tvTitle1=(TextView) view.findViewById(R.id.news1_title);
                tvTitle1.setText(myNew.getTitle());
                tvTitle1.setTextColor(Color.BLACK);
                TextView tvTitle2=(TextView) view.findViewById(R.id.source1);
                tvTitle2.setText("来源:"+myNew.getSource());
                TextView tvTitle3=(TextView) view.findViewById(R.id.time1);
                tvTitle3.setText("时间:"+myNew.getTime());
                ImageView ivTitle=(ImageView) view.findViewById(R.id.imageView);
                ivTitle.setImageResource(myNew.getImageSource());
                return view;
            }
        }

        //借用适配器ArrayAdapter来将数据传入ListView
        MyAdapter adapter=new MyAdapter(ListActivity.this,R.layout.news_item,lstNews);
        listView=(ListView) findViewById(R.id.listview_title);
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id) {

                //用Intent传输数据到DetailActivity
                Intent intent = new Intent();
                intent.setClassName(ListActivity.this, "com.example.lab.myapplication.DetailActivity");
                number= news[position].getId();
                intent.putExtra("news_title", news[position].getTitle());
                intent.putExtra("source", news[position].getSource());
                intent.putExtra("time", news[position].getTime());
                intent.putExtra("news_content", news[position].getContent());
                startActivityForResult(intent, 1);
            }
        });


    }

    private void getAlRead()
    {
        //达到规定阅读时间,则将新闻ID存入文件
        if((ttime2-ttime1)/1000>5 && ttime1!=0) {

            SharedPreferences.Editor editor = getSharedPreferences("AlRead", MODE_PRIVATE).edit();
            lstID.add(number);
            //将已读新闻ID转化为字符串保存
            String str = "";
            for (int i = 0; i < lstID.size(); i++) {
                str += lstID.get(i) + ",";
            }
            editor.putString("data", str);
            editor.apply();
        }
    }

    private void changeColor()
    {
        //如果文件存在,则将文件内已读新闻置灰
        File mml=new File("data/data/com.example.lab.myapplication/shared_prefs","AlRead.xml");
        if(mml.exists())
        {
            SharedPreferences pref=getSharedPreferences("AlRead", MODE_PRIVATE);
            String str=pref.getString("data","");
            //将字符串以“,”分割为字符数组sstr
            String sstr[]=str.split("[,]");
            //再将字符数组存入List
            List lstAlRead=new ArrayList();
            for (int i=0; i

DetailActivity.java

public class DetailActivity extends AppCompatActivity {

    long stopTime1=0;
    static boolean isIn=false;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);

        isIn=true;
        //Intent接收数据并显示
        Intent intent =getIntent();

        TextView title=(TextView) findViewById(R.id.title);
        title.setText(intent.getStringExtra("news_title"));

        TextView source=(TextView) findViewById(R.id.source);
        source.setText("来源:"+intent.getStringExtra("source"));

        TextView time=(TextView) findViewById(R.id.time);
        time.setText("时间:"+intent.getStringExtra("time"));

        TextView content=(TextView) findViewById(R.id.content);
        content.setText(intent.getStringExtra("news_content"));

    }



    @Override
    protected void onStart() {
        super.onStart();
        stopTime1=System.currentTimeMillis();
        ListActivity.ttime1=stopTime1;

    }

}

CreateNewsDB.java

public class CreateNewsDB extends SQLiteOpenHelper{

    public static final String CREATE_NEWS="create table NewsTable(" +
            "nlID integer primary key autoincrement," +
            "Title text," +
            "Content text" +
            ",Source text," +
            "time text," +
            "imageSource int)";

    private Context mContex;
    public CreateNewsDB(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        //若相同名字的数据库已经存在则先删除
        if(getDatabaseName()==name)
        {
            context.deleteDatabase(name);
        }
        mContex=context;
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_NEWS);
        Toast.makeText(mContex,"create succeeded",Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        db.execSQL("drop table if exists NewsTable");
        onCreate(db);
    }
}

News.java

public class News {

        public String id;
        public String title;
        public String content;
        public String Source;
        public String Time;
        public int imageSource;

    public int getImageSource() {
        return imageSource;
    }

    public void setImageSource(int imageSource) {
        this.imageSource = imageSource;
    }


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

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

 

你可能感兴趣的:(移动开发)