我正在開發應用程序,其中很少有功能是常見的,所以我創建了一個庫來將公共代碼放在單一點上。我在庫中實現了SQLite數據庫。Android庫中的SQLite數據庫,它將在應用程序之間共享嗎?
我的問題是SQLite庫的數據庫將被應用程序共享? 我的意思是當從應用程序A插入X值(使用公共庫)時,這個數據是否也可以從應用程序B(使用公共庫)訪問。
我認爲數據不會被共享,因爲每個應用都會有自己的存儲和數據將被保存在存儲只,仍然需要澄清這一點。
我正在開發應用程序,其中很少有功能是常見的,所以我創建了一個庫來將公共代碼放在單一點上。我在庫中實現了SQLite數據庫。Android庫中的SQLite數據庫,它將在應用程序之間共享嗎?
我的問題是SQLite庫的數據庫將被應用程序共享? 我的意思是當從應用程序A插入X值(使用公共庫)時,這個數據是否也可以從應用程序B(使用公共庫)訪問。
我認爲數據不會被共享,因爲每個應用都會有自己的存儲和數據將被保存在存儲只,仍然需要澄清這一點。
每個應用程序的SQL數據庫存儲在他們在存儲上的私人文件夾。所以路徑如下。
/data/data/[app_package_name]/databases/[database_name]
應用程序無法使用SQLite數據庫彼此共享數據。
如果我們要的數據得到中我們可以使用內容提供商的其他應用共享。
http://developer.android.com/reference/android/content/ContentProvider.html
可以存儲數據的專用應用程序文件夾之外,並從任何應用程序訪問它。
如果店內專用應用程序文件夾的數據,如果你有相同的sharedUserId你只能分享私人數據。應用程序必須使用相同的證書進行簽名才能進行共享。
在應用程序之間共享數據的更好方法是創建一個ContentProvider。它提供了與數據庫相似的接口,並可通過應用程序權限提供訪問限制。
您可以通過在你的應用程序,它可以容納圖像元數據項內容提供商類使用ContentProviders
從一個應用實例another.For共享數據。我們將使用本地SQLite數據庫來存儲數據,但您可以使用任何你喜歡的地方來存儲數據。
首先創建一個ImagesProvider
類延伸ContentProvider
類並覆蓋以下方法。
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
public class ImagesProvider extends ContentProvider {
private static final String PROVIDER_NAME = "androidcontentproviderdemo.androidcontentprovider.images";
private static final Uri CONTENT_URI = Uri.parse("content://" + PROVIDER_NAME + "/images");
private static final int IMAGES = 1;
private static final int IMAGE_ID = 2;
private static final UriMatcher uriMatcher = getUriMatcher();
private static UriMatcher getUriMatcher() {
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(PROVIDER_NAME, "images", IMAGES);
uriMatcher.addURI(PROVIDER_NAME, "images/#", IMAGE_ID);
return uriMatcher;
}
private ImageDatabase imageDataBase = null;
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)) {
case IMAGES:
return "vnd.android.cursor.dir/vnd.com.androidcontentproviderdemo.androidcontentprovider.provider.images";
case IMAGE_ID:
return "vnd.android.cursor.item/vnd.com.androidcontentproviderdemo.androidcontentprovider.provider.images";
}
return "";
}
@Override
public boolean onCreate() {
Context context = getContext();
imageDataBase = new ImageDatabase(context);
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
String id = null;
if(uriMatcher.match(uri) == IMAGE_ID) {
//Query is for one single image. Get the ID from the URI.
id = uri.getPathSegments().get(1);
}
return imageDataBase.getImages(id, projection, selection, selectionArgs, sortOrder);
}
@Override
public Uri insert(Uri uri, ContentValues values) {
try {
long id = imageDataBase.addNewImage(values);
Uri returnUri = ContentUris.withAppendedId(CONTENT_URI, id);
return returnUri;
} catch(Exception e) {
return null;
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
String id = null;
if(uriMatcher.match(uri) == IMAGE_ID) {
//Delete is for one single image. Get the ID from the URI.
id = uri.getPathSegments().get(1);
}
return imageDataBase.deleteImages(id);
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
String id = null;
if(uriMatcher.match(uri) == IMAGE_ID) {
//Update is for one single image. Get the ID from the URI.
id = uri.getPathSegments().get(1);
}
return imageDataBase.updateImages(id, values);
}
}
要存儲內容,我們需要爲我們的內容提供者提供一個數據庫輔助類。創建一個ImageDataBase
類如下
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import java.sql.SQLException;
public class ImageDataBase extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "ImagesDatabase.db";
private static final String TABLE_NAME = "imagestore";
private static final String SQL_CREATE = "CREATE TABLE " + TABLE_NAME +
" (_id INTEGER PRIMARY KEY, IMAGETITLE TEXT , IMAGEURL TEXT , IMAGEDESC TEXT)";
private static final String SQL_DROP = "DROP TABLE IS EXISTS " + TABLE_NAME ;
ImageDataBase(Context context) {
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(SQL_DROP);
onCreate(db);
}
public Cursor getImages(String id, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder sqliteQueryBuilder = new SQLiteQueryBuilder();
sqliteQueryBuilder.setTables(TABLE_NAME);
if(id != null) {
sqliteQueryBuilder.appendWhere("_id" + " = " + id);
}
if(sortOrder == null || sortOrder == "") {
sortOrder = "IMAGETITLE";
}
Cursor cursor = sqliteQueryBuilder.query(getReadableDatabase(),
projection,
selection,
selectionArgs,
null,
null,
sortOrder);
return cursor;
}
public long addNewImage(ContentValues values) throws SQLException {
long id = getWritableDatabase().insert(TABLE_NAME, "", values);
if(id <=0) {
throw new SQLException("Failed to add an image");
}
return id;
}
public int deleteImages(String id) {
if(id == null) {
return getWritableDatabase().delete(TABLE_NAME, null , null);
} else {
return getWritableDatabase().delete(TABLE_NAME, "_id=?", new String[]{id});
}
}
public int updateImages(String id, ContentValues values) {
if(id == null) {
return getWritableDatabase().update(TABLE_NAME, values, null, null);
} else {
return getWritableDatabase().update(TABLE_NAME, values, "_id=?", new String[]{id});
}
}
}
聲明內容提供商在AndroidManifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androidcontentproviderdemo.androidcontentprovider">
<application android:allowBackup="true" android:label="@string/app_name"
android:icon="@mipmap/ic_launcher" android:theme="@style/AppTheme">
<provider android:name="com.androidcontentproviderdemo.androidcontentprovider.ImagesProvider" android:authorities="androidcontentproviderdemo.androidcontentprovider.images">
</provider>
</application>
</manifest>
使用內容提供商
public class MainActivity extends Activity {
private static final String PROVIDER_NAME = "androidcontentproviderdemo.androidcontentprovider.images";
private static final Uri CONTENT_URI = Uri.parse("content://" + PROVIDER_NAME + "/images");
private ListView listView;
private SimpleCursorAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.lstViewImages);
adapter = new SimpleCursorAdapter(getBaseContext(),
R.layout.list_layout,
null,
new String[] { "IMAGETITLE", "IMAGEURL", "IMAGEDESC"},
new int[] { R.id.imgTitle , R.id.imgUrl, R.id.imgDesc }, 0);
listView.setAdapter(adapter);
refreshValuesFromContentProvider();
}
private void refreshValuesFromContentProvider() {
CursorLoader cursorLoader = new CursorLoader(getBaseContext(), CONTENT_URI,
null, null, null, null);
Cursor c = cursorLoader.loadInBackground();
adapter.swapCursor(c);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
public void onClickAddImage(View view) {
ContentValues contentValues = new ContentValues();
contentValues.put("IMAGETITLE", ((EditText) findViewById(R.id.edtTxtImageTitle)).getText().toString());
contentValues.put("IMAGEURL" , ((EditText)findViewById(R.id.edtImageUrl)).getText().toString());
contentValues.put("IMAGEDESC", ((EditText) findViewById(R.id.edtImageDesc)).getText().toString());
Uri uri = getContentResolver().insert(CONTENT_URI, contentValues);
Toast.makeText(getBaseContext(), uri.toString(), Toast.LENGTH_LONG).show();
refreshValuesFromContentProvider();
}
}
AFAIK你不能從任何其他應用程序 –
是的,我GOOGLE了一下,發現應用程序,而不使內容提供商不能共享他們的數據訪問其它應用私有數據。 –