2015-11-27 71 views
1

我正在開發應用程序,其中很少有功能是常見的,所以我創建了一個庫來將公共代碼放在單一點上。我在庫中實現了SQLite數據庫。Android庫中的SQLite數據庫,它將在應用程序之間共享嗎?

我的問題是SQLite庫的數據庫將被應用程序共享? 我的意思是當從應用程序A插入X值(使用公共庫)時,這個數據是否也可以從應用程序B(使用公共庫)訪問。

我認爲數據不會被共享,因爲每個應用都會有自己的存儲和數據將被保存在存儲只,仍然需要澄清這一點。

+1

AFAIK你不能從任何其他應用程序 –

+0

是的,我GOOGLE了一下,發現應用程序,而不使內容提供商不能共享他們的數據訪問其它應用私有數據。 –

回答

0

每個應用程序的SQL數據庫存儲在他們在存儲上的私人文件夾。所以路徑如下。

/data/data/[app_package_name]/databases/[database_name] 

應用程序無法使用SQLite數據庫彼此共享數據。

如果我們要的數據得到中我們可以使用內容提供商的其他應用共享。

http://developer.android.com/reference/android/content/ContentProvider.html

0

可以存儲數據的專用應用程序文件夾之外,並從任何應用程序訪問它。

如果店內專用應用程序文件夾的數據,如果你有相同的sharedUserId你只能分享私人數據。應用程序必須使用相同的證書進行簽名才能進行共享。

0

在應用程序之間共享數據的更好方法是創建一個ContentProvider。它提供了與數據庫相似的接口,並可通過應用程序權限提供訪問限制。

0

您可以通過在你的應用程序,它可以容納圖像元數據項內容提供商類使用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(); 
    } 
} 
相關問題