GVKun编程网logo

使用root-access在Android上打开另一个应用程序的sqlite-database

6

本文将介绍使用root-access在Android上打开另一个应用程序的sqlite-database的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一

本文将介绍使用root-access在Android上打开另一个应用程序的sqlite-database的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于-Android 数据库 SQLiteDatabase 的使用、android intent隐式调用之一个应用程序启动另一个应用程序、Android SQLite Database、android SQLiteDatabase的知识。

本文目录一览:

使用root-access在Android上打开另一个应用程序的sqlite-database

使用root-access在Android上打开另一个应用程序的sqlite-database

我想打开另一个应用程序的数据库.
我知道我必须具有root访问权限,但似乎root访问权限仅适用于shell命令.

我想在数据库中进行大量选择和一些插入.
是否可以以root身份打开数据库,并在“普通”应用程序中使用db-handle?

提前致谢

拜伯

解决方法:

谢谢你的所有答案!
我认为唯一的方法是制作这样的东西:

Process p = Runtime.getRuntime().exec("su sqlite3 -csv test.db \"select * from test\";");

然后,我必须使用cvs解析器解析OutputStream,….
我希望我能以更简单的方式做到这一点,但我认为没有解决方案.

也许我可以在我的应用程序的目录中创建一个文件的硬链接,但这是非常危险的,因为这样一个数据库有两个“.journal”文件.

感谢帮助

拜伯

-Android 数据库 SQLiteDatabase 的使用

-Android 数据库 SQLiteDatabase 的使用

高春辉、王春生、朱峰:关于开源创业的 15 件小事

Android 提供了三种数据存储方式:
第一种是文件存储。
第二种是 SharedPreferences 存储。
第三种是数据库 SQLiteDatabase 存储。

文件存储我就不多说了,而 SharedPreferences 可以存取简单的数据 (int,double,float.etc),它经常用于数据缓存,因为它读取存储简单。详细可以参见本系列《Android 高手进阶教程》7.Android Preferences 的使用

今天我们将讲一下 Android SQLiteDatabase 的使用。而掌握 SqliteDatabase,将会我们接下来掌握 ContentProvider 打下良好的基石。

为了让大家更好的掌握,我们手把手完成该节的 Demo。

第一步:新建一个 Android 工程,命名为 SQLiteDatabaseDemo

SQLiteDatabaseDemo

第二步:创建一个新的类 BooksDB.java 这个类要继承于 android.database.sqlite.SQLiteOpenHelper 抽象类,我们要实现其中两个方法:onCreate (),onUpdate。具体代码如下:

package com.android.tutor;
 
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
 
public class BooksDB extends SQLiteOpenHelper {
private final static String DATABASE_NAME = "BOOKS.db";
private final static int DATABASE_VERSION = 1;
private final static String TABLE_NAME = "books_table";
public final static String BOOK_ID = "book_id";
public final static String BOOK_NAME = "book_name";
public final static String BOOK_AUTHOR = "book_author";
 
public BooksDB(Context context) {
// TODO Auto-generated constructor stub
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
 
// 创建 table
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE " + TABLE_NAME + " (" + BOOK_ID
+ " INTEGER primary key autoincrement, " + BOOK_NAME
+ " text, " + BOOK_AUTHOR + " text);";
db.execSQL(sql);
}
 
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;
db.execSQL(sql);
onCreate(db);
}
 
public Cursor select() {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db
.query(TABLE_NAME, null, null, null, null, null, null);
return cursor;
}
 
// 增加操作
public long insert(String bookname, String author) {
SQLiteDatabase db = this.getWritableDatabase();
/* ContentValues */
ContentValues cv = new ContentValues();
cv.put(BOOK_NAME, bookname);
cv.put(BOOK_AUTHOR, author);
long row = db.insert(TABLE_NAME, null, cv);
return row;
}
 
// 删除操作
public void delete(int id) {
SQLiteDatabase db = this.getWritableDatabase();
String where = BOOK_ID + " = ?";
String[] whereValue = { Integer.toString(id) };
db.delete(TABLE_NAME, where, whereValue);
}
 
// 修改操作
public void update(int id, String bookname, String author) {
SQLiteDatabase db = this.getWritableDatabase();
String where = BOOK_ID + " = ?";
String[] whereValue = { Integer.toString(id) };
 
ContentValues cv = new ContentValues();
cv.put(BOOK_NAME, bookname);
cv.put(BOOK_AUTHOR, author);
db.update(TABLE_NAME, cv, where, whereValue);
}
}

第三步:修改 main.xml 布局如下,由两个 EditText 和一个 ListView 组成,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText
android:id="@+id/bookname"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<EditText
android:id="@+id/author"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<ListView
android:id="@+id/bookslist"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>

第四步:修改 SQLiteDatabaseDemo.java 代码如下:

package com.android.tutor;
 
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
 
public class SQLiteDatabaseDemo extends Activity implements
AdapterView.OnItemClickListener {
private BooksDB mBooksDB;
private Cursor mCursor;
private EditText BookName;
private EditText BookAuthor;
private ListView BooksList;
 
private int BOOK_ID = 0;
protected final static int MENU_ADD = Menu.FIRST;
protected final static int MENU_DELETE = Menu.FIRST + 1;
protected final static int MENU_UPDATE = Menu.FIRST + 2;
 
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setUpViews();
}
 
public void setUpViews() {
mBooksDB = new BooksDB(this);
mCursor = mBooksDB.select();
 
BookName = (EditText) findViewById(R.id.bookname);
BookAuthor = (EditText) findViewById(R.id.author);
BooksList = (ListView) findViewById(R.id.bookslist);
 
BooksList.setAdapter(new BooksListAdapter(this, mCursor));
BooksList.setOnItemClickListener(this);
}
 
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
 
menu.add(Menu.NONE, MENU_ADD, 0, "ADD");
menu.add(Menu.NONE, MENU_DELETE, 0, "DELETE");
menu.add(Menu.NONE, MENU_DELETE, 0, "UPDATE");
return true;
}
 
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case MENU_ADD:
add();
break;
case MENU_DELETE:
delete();
break;
case MENU_UPDATE:
update();
break;
}
return true;
}
 
public void add() {
String bookname = BookName.getText().toString();
String author = BookAuthor.getText().toString();
// 书名和作者都不能为空,或者退出
if (bookname.equals("") || author.equals("")) {
return;
}
mBooksDB.insert(bookname, author);
mCursor.requery();
BooksList.invalidateViews();
BookName.setText("");
BookAuthor.setText("");
Toast.makeText(this, "Add Successed!", Toast.LENGTH_SHORT).show();
}
 
public void delete() {
if (BOOK_ID == 0) {
return;
}
mBooksDB.delete(BOOK_ID);
mCursor.requery();
BooksList.invalidateViews();
BookName.setText("");
BookAuthor.setText("");
Toast.makeText(this, "Delete Successed!", Toast.LENGTH_SHORT).show();
}
 
public void update() {
String bookname = BookName.getText().toString();
String author = BookAuthor.getText().toString();
// 书名和作者都不能为空,或者退出
if (bookname.equals("") || author.equals("")) {
return;
}
mBooksDB.update(BOOK_ID, bookname, author);
mCursor.requery();
BooksList.invalidateViews();
BookName.setText("");
BookAuthor.setText("");
Toast.makeText(this, "Update Successed!", Toast.LENGTH_SHORT).show();
}
 
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
 
mCursor.moveToPosition(position);
BOOK_ID = mCursor.getInt(0);
BookName.setText(mCursor.getString(1));
BookAuthor.setText(mCursor.getString(2));
 
}
 
public class BooksListAdapter extends BaseAdapter {
private Context mContext;
private Cursor mCursor;
 
public BooksListAdapter(Context context, Cursor cursor) {
 
mContext = context;
mCursor = cursor;
}
 
@Override
public int getCount() {
return mCursor.getCount();
}
 
@Override
public Object getItem(int position) {
return null;
}
 
@Override
public long getItemId(int position) {
return 0;
}
 
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView mTextView = new TextView(mContext);
mCursor.moveToPosition(position);
mTextView.setText(mCursor.getString(1) + "___"
+ mCursor.getString(2));
return mTextView;
}
 
}
}

第五步:运行程序效果如下:

程序效果1

程序效果2

程序效果3

程序效果4

程序效果5

程序效果6

第六步:查看我们所建的数据库。有两种方法:第一种用命令查看:adb shell ls data/data/com.android.tutor/databases。

另一种方法是用 DDMS 查看,在 data/data 下面对应的应用程序的包名 下会有如下数据库,如图所示:

File Explorer


android intent隐式调用之一个应用程序启动另一个应用程序

android intent隐式调用之一个应用程序启动另一个应用程序

理解Intent的关键之一是理解清楚Intent的两种基本用法:一种是显式的Intent,即在构造Intent对象时就指定接收者,这种方式与普通的函数调用类似;另一种是隐式的Intent,即Intent的发送者在构造Intent对象时,并不知道也不关心接收者是谁,这种方式与函数调用差别比较大,有利于降低发送者和接收者之间的耦合。另外Intent除了发送外,还可用于广播.

显示调用 1.Intent intent = new Intent(); intent.setClass(A.this,B.class); //intent.setClassName("com.view","com.view.B");前者是A的包名,后者是B的代包类名

startActivity(Intent);

隐式调用:private static String MY_ACTION = "com.view.my_action";

              Intent intent = new Intent();  intent.setAction(MY_ACTION);

               或者// Intent intent = new Intent(MY_ACTION);

                startActivity(Intent);

隐式调用注意不只是在AndroidManifest.xml文件中声明,还要加上intent-filter

在B类的activity中加上:

<intent-filter>

    <action android:name="com.view.my_action"/>  <!-- 自定义 -->

</intent-filter>

加上这句话就可以跳转到B类了

如果是想启动另外一个应用程序,如B类是在另外一个应用程序的入口,在其activity中再另外加上一个intent-filter

<activity android:name=".B" android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

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

</intent-filter>

<intent-filter>

<action android:name="com.view.my_action"/>

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

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

</intent-filter>

</activity>

Android SQLite Database

Android SQLite Database

Create

public void insertAnimal(HashMap<StringString> queryValues) {
  SQLiteDatabase database = this.getWritableDatabase();
  ContentValues values = new ContentValues();
  values.put("animalName", queryValues.get("animalName"));
  database.insert("animals"null, values);
  database.close();
}

Read

public HashMap<StringString> getAnimalInfo(String id) {
  HashMap<StringString> wordList = new HashMap<StringString>();
  SQLiteDatabase database = this.getReadableDatabase();
  String selectQuery = "SELECT * FROM animals where animalId=''"+id+"''";
  Cursor cursor = database.rawQuery(selectQuery, null);
  if (cursor.moveToFirst()) {
    do {
      wordList.put("animalName", cursor.getString(1));
    } while (cursor.moveToNext());
  }           
  return wordList;
}

Update

public int updateAnimal(HashMap<String, String> queryValues) {
  SQLiteDatabase database = this.getWritableDatabase();  
  ContentValues values = new ContentValues();
  values.put("animalName", queryValues.get("animalName"));
  return database.update("animals", values, "animalId" + " = ?"new String[] { queryValues.get("animalId") });
}

Delete

public void deleteAnimal(String id) {
  Log.d(LOGCAT,"delete");
  SQLiteDatabase database = this.getWritableDatabase();  
  String deleteQuery = "DELETE FROM  animals where animalId=''"+ id +"''";
  Log.d("query",deleteQuery);   
  database.execSQL(deleteQuery);
}

DBController.java

Complete code is as follows,

import java.util.ArrayList;
import java.util.HashMap;
 
import android.util.Log;
 
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
 
public class DBController  extends SQLiteOpenHelper {
  private static final String LOGCAT = null;
 
  public DBController(Context applicationcontext) {
    super(applicationcontext, "androidsqlite.db"null1);
    Log.d(LOGCAT,"Created");
  }
 
  @Override
  public void onCreate(SQLiteDatabase database) {
    String query;
    query = "CREATE TABLE animals ( animalId INTEGER PRIMARY KEY, animalName TEXT)";
    database.execSQL(query);
    Log.d(LOGCAT,"animals Created");
  }
  @Override
  public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) {
    String query;
    query = "DROP TABLE IF EXISTS animals";
    database.execSQL(query);
    onCreate(database);
  }
 
  public void insertAnimal(HashMap<StringString> queryValues) {
    SQLiteDatabase database = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("animalName", queryValues.get("animalName"));
    database.insert("animals"null, values);
    database.close();
  }
 
  public int updateAnimal(HashMap<StringString> queryValues) {
    SQLiteDatabase database = this.getWritableDatabase();  
    ContentValues values = new ContentValues();
    values.put("animalName", queryValues.get("animalName"));
    return database.update("animals", values, "animalId" + " = ?"new String[] { queryValues.get("animalId") });
  }
 
  public void deleteAnimal(String id) {
    Log.d(LOGCAT,"delete");
    SQLiteDatabase database = this.getWritableDatabase();  
    String deleteQuery = "DELETE FROM  animals where animalId=''"+ id +"''";
    Log.d("query",deleteQuery);   
    database.execSQL(deleteQuery);
  }
 
  public ArrayList<HashMap<StringString>> getAllAnimals() {
    ArrayList<HashMap<StringString>> wordList;
    wordList = new ArrayList<HashMap<StringString>>();
    String selectQuery = "SELECT  * FROM animals";
    SQLiteDatabase database = this.getWritableDatabase();
    Cursor cursor = database.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
      do {
        HashMap<StringString> map = new HashMap<StringString>();
        map.put("animalId", cursor.getString(0));
        map.put("animalName", cursor.getString(1));
        wordList.add(map);
      } while (cursor.moveToNext());
    }
    return wordList;
  }
 
  public HashMap<StringString> getAnimalInfo(String id) {
    HashMap<StringString> wordList = new HashMap<StringString>();
    SQLiteDatabase database = this.getReadableDatabase();
    String selectQuery = "SELECT * FROM animals where animalId=''"+id+"''";
    Cursor cursor = database.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
      do {
        wordList.put("animalName", cursor.getString(1));
      } while (cursor.moveToNext());
    }           
    return wordList;
  } 
}

布局自己看着弄吧!

android SQLiteDatabase

android SQLiteDatabase

转载地址: http://blog.sina.com.cn/s/blog_6fff321b0100onw8.html

SQLiteDatabase

[功能]

SQLiteDatabase 是关于数据库操作的 可用于 insert delete update query 等操作可惜美中不足的是:

1. 其不支持创建数据库

2. 其不支持版本更新 或者说其不知道如何做 因为具体数据的差异

鉴于以上的缺陷 有一个辅助类可以完成上面功能 那就是:SQLiteOpenHelper

[代码]

1. 定义 SQLiteOpenHelper 并完成 创建 更新 功能

  1. publicclassDBHelper extendsSQLiteOpenHelper { 
  2. publicstaticfinalString TB_NAME = "mycountry"
  3. publicstaticfinalString ID = "_id"
  4. publicstaticfinalString COUNTRY = "country"
  5. publicstaticfinalString CODE = "code"
  6. publicDBHelper(Context context, String name, 
  7. CursorFactory factory,intversion) { 
  8. super(context, name, factory, version); 
  9. publicvoidonCreate(SQLiteDatabase db) { 
  10. db.execSQL("CREATE TABLE IF NOT EXISTS "
  11. + TB_NAME + " ("
  12. + ID + " INTEGER PRIMARY KEY,"
  13. + COUNTRY + " VARCHAR,"
  14. + CODE + " INTEGER)"); 
  15. publicvoidonUpgrade(SQLiteDatabase db, 
  16. intoldVersion, intnewVersion) { 
  17. //TODO 删除数据库之前 做数据备份
  18. db.execSQL("DROP TABLE IF EXISTS "+TB_NAME); 
  19. onCreate(db); 

2. 从 SQLiteOpenHelper 得到 SQLiteDatabase 的实例

  1. DBHelper helper = newDBHelper(this, DB_NAME, null, VERSION); 
  2. SQLiteDatabase db = helper.getWritableDatabase(); 

3. SQLiteDatabase 的一些操作:

* 插入数据:

  1. ContentValues values = newContentValues(); 
  2. values.put(DBHelper.COUNTRY, "中国"); 
  3. values.put(DBHelper.CODE, 86); 
  4. db.insert(DBHelper.TB_NAME,DBHelper.ID, values); 

* 改动数据

  1. db.insert(DBHelper.TB_NAME,DBHelper.ID,null); 
  2. values.clear(); 
  3. values.put(DBHelper.COUNTRY, "意大利"); 
  4. values.put(DBHelper.CODE, 39); 
  5. db.update(DBHelper.TB_NAME, values,DBHelper.ID + " = 2",null); 

* execSQL 执行 SQL 语言

  1. db.execSQL("INSERT INTO "
  2. + DBHelper.TB_NAME + "("
  3. + DBHelper.COUNTRY + ","
  4. + DBHelper.CODE + ") VALUES "
  5. "('' 洪都拉斯 '',504)"); 

* 查询数据

  1. Cursor c = db.query(DBHelper.TB_NAME,null,null,null,null,null
  2. DBHelper.CODE+" DESC"); 

* 删除数据所有数据

  1. db.delete(DBHelper.TB_NAME,null,null); 

数据库的生成 调用 getWiterAbleDatabase getReadAbleDatabase 生成数据库 i

android 嵌入式数据库 为单用户数据库 所以 可以不调用 db.close () 来关闭数据库这样反而可以提高性能

关于使用root-access在Android上打开另一个应用程序的sqlite-database的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于-Android 数据库 SQLiteDatabase 的使用、android intent隐式调用之一个应用程序启动另一个应用程序、Android SQLite Database、android SQLiteDatabase等相关内容,可以在本站寻找。

本文标签: