您的位置:首页 > 移动开发

安卓:AsyncTaskLoader及时获取数据库中数据,点菜单转另一个APP操作数据

2015-09-21 21:11 543 查看
异步loader项目的结果图:



加权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

异步Loader类的主逻辑代码文件:

<span style="font-size:18px;">package com.example.day17_aysnctaskloader;

import java.io.File;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.AsyncTaskLoader;
import android.content.Context;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import android.widget.TextView;

@SuppressLint("NewApi")
public class MainActivity extends Activity implements LoaderCallbacks<Cursor>{

ListView lv;
TextView tv_show;
LoaderManager manager;
SimpleCursorAdapter adapter;
static SQLiteDatabase db;
@SuppressLint("NewApi") @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView) findViewById(R.id.lv);
tv_show=(TextView) findViewById(R.id.tv_show);
manager=getLoaderManager();
manager.initLoader(1, null, this);
String path=Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"Download"+File.separator+"info.db";
db=SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);
adapter=new SimpleCursorAdapter(getApplicationContext(), R.layout.item, null, new String[]{"_id","name"},new int[]{R.id.m_id,R.id.m_name},SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
lv.setAdapter(adapter);
lv.setEmptyView(tv_show);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId())
{
case R.id.operation:
Intent intent=new Intent();
intent.setAction("hh.pp.day");
startActivity(intent);
break;
}
return super.onOptionsItemSelected(item);
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
MyLoader loader=new MyLoader(MainActivity.this);
return loader;
}

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
adapter.swapCursor(arg1);
}

@Override
public void onLoaderReset(Loader<Cursor> arg0) {
adapter.swapCursor(null);
}
//自定义loader
@SuppressLint("NewApi")
public static class MyLoader extends AsyncTaskLoader<Cursor>
{

@SuppressLint("NewApi")
public MyLoader(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

//当创建完毕 加载数据的方法,启动加载
@SuppressLint("NewApi")
@Override
protected void onStartLoading() {
super.onStartLoading();
//必须加,强制向下执行  强制加载异步数据,否则不向下执行
forceLoad();
}

//开启后台,做耗时操作
@Override
public Cursor loadInBackground() {
Cursor c=db.rawQuery("select * from person", null);

return c;
}
//执行完成loadInBackground之后调用,接受loadInBackground返回的数据
@Override
public void deliverResult(Cursor data) {
// TODO Auto-generated method stub
super.deliverResult(data);
}
}
}
</span>


主布局文件:

<span style="font-size:18px;"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<TextView
android:id="@+id/tv_show"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="暂无数据"
android:gravity="center"
android:textColor="#00ff00"/>

</RelativeLayout>
</span>


适配器布局文件:

<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/m_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#0000ff"
android:textSize="18sp"
android:layout_margin="10dp"/>
<TextView
android:id="@+id/m_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#0000ff"
android:textSize="18sp"
android:layout_margin="10dp"/>

</LinearLayout>
</span>


跳转到的操作数据的APP:

跳转后见到的页面:



清单文件中:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<activity

android:name=".SecondActivity">

<intent-filter>

<action android:name="hh.pp.day"/>

<category android:name="android.intent.category.DEFAULT"/>

</intent-filter>

</activity>

建项目时第一个页面不需要动,再建一个类和布局:

第二个类逻辑代码文件:

package com.day17_lijieatloaderdb;

import java.io.File;

import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.EditText;

public class SecondActivity extends Activity {

EditText et_id,et_name;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
et_id=(EditText) findViewById(R.id.et_id);
et_name=(EditText) findViewById(R.id.et_name);
String path=Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"Download"+File.separator+"info.db";
db=SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);

}
public void click(View v)
{
switch(v.getId())
{
case R.id.bt_add:
String id=et_id.getText().toString();
String name=et_name.getText().toString();
ContentValues values=new ContentValues();
values.put("_id",Integer.parseInt(id));
values.put("name",name);
db.insert("person", null, values);
finish();
break;
case R.id.bt_update:
String id2=et_id.getText().toString();
String name2=et_name.getText().toString();
ContentValues values2=new ContentValues();
values2.put("name",name2);
db.update("person", values2, "_id=?", new String[]{id2});
finish();
break;
case R.id.bt_delete:
String id3=et_id.getText().toString();
db.delete("person", "_id=?", new String[]{id3});
finish();
break;
}
}

}


第二个类的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/et_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入id"/>
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入name"/>
<Button
android:id="@+id/bt_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加数据"
android:onClick="click"/>
<Button
android:id="@+id/bt_update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="更新数据"
android:onClick="click"/>
<Button
android:id="@+id/bt_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除数据"
android:onClick="click"/>

</LinearLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: