ContentProvider 跨进程数据读取

跨进程数据读取

工作中经常要夸进程取数据,每次都是翻代码,今天有空,就将其模板式的记录下了。

大概思路

1.在需要暴露数据的程序A中

①建数据库
②建ContentProvider类
③注册清单文件

2.程序 B中进行获取数据。

实例:

建数据库

public class MySqlDatabase extends SQLiteOpenHelper    {

public MySqlDatabase(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
    super(context, name, factory, version);
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
    sqLiteDatabase.execSQL("create table status_bar_tb ,(_id integer, pkgname varchar(100))");
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

}
}

建ContentProvider类

public class MyContentProvider extends ContentProvider{


UriMatcher um;
static final String AUTHORITY = "com.android.status_bar";

@Override
public String getType(Uri uri) {
    return null;
}


@Override
public Uri insert(Uri uri, ContentValues contentValues) {
    return null;
}

@Override
public int delete(Uri uri, String s, String[] strings) {
    return 0;
}


@Override
public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {
    return 0;
}

@Override
public boolean onCreate() {
    um = new UriMatcher(UriMatcher.NO_MATCH);
    um.addURI(AUTHORITY, "status_bar_db", 1);
    return false;
}


@Override
public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
    SQLiteDatabase db = getContext().openOrCreateDatabase("status_bar_db", Context.MODE_PRIVATE, null);

    Cursor cursor = db.rawQuery("select * from status_bar_tb", null);
    return cursor;
}

}

注册清单文件


B程序:

public class Main extends Activity {  
/** Called when the activity is first created. */  
@Override  
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.main);  

    //取得ContentResolver对象  
    ContentResolver cr = getContentResolver();  
    //指定uri并指定操作哪个表  
    Uri uri = Uri.parse("content://com.android.status_bar/status_bar_tb");  
    //执行query方法返回一个结果集  
    Cursor cs = null;
    try {
cs = cr.query(uri, null, null, null, null);  
    if (cursor != null) {
    //遍历结果集,取出数据  
    while(cs.moveToNext()){  
        //do something  
        }
    }
} catch (Exception e){
      e.printStatckTrace();
   } finally {
      if (cursor != null) {
           cursor.close();
        }
     }  
}  
}

存在数据库的操作,自然就要写子线程:

  private void initData() {
      // 1、直接new 一个线程类,传入参数实现Runnable接口的对象    (new Runnable),相当于方法二
    new Thread(new Runnable() {
        @Override
        public void run() {
            // 写子线程中的操作
        }
    }).start();

    // 2、通过实现Runnable接口
    Thread t = new Thread(new myRunnable());
    t.start();

    // 3、通过继承线程类实现
    new myThread().start();

}

// Thread是一个类,必须继承
public class myThread extends Thread {
    @Override
    public void run() {
        super.run();
        // 写子线程中的操作
    }
}

// Runnable是一个接口,需要实现
public class myRunnable implements Runnable {
    @Override
    public void run() {
        // 写子线程中的操作

    }

}

}

你可能感兴趣的:(Android,SQLite)