BCA / B.Tech 14 min read

Sharing Data with Content Providers in HIndi

Content Providers के साथ Data Share करना

Content Provider क्या है? (What is a Content Provider?)

Content Provider Android framework का एक component है जो applications के बीच structured data को share करने का एक standard तरीका प्रदान करता है। यह data access को manage करता है और data security सुनिश्चित करता है।

यह एक database और दूसरी applications के बीच एक abstraction layer (एक परत) की तरह काम करता है। Apps सीधे database को access नहीं करतीं; वे Content Provider के माध्यम से request भेजती हैं।

उदाहरण: Android का built-in "Contacts" app अपना data एक Content Provider के माध्यम से expose करता है, ताकि दूसरी apps (जैसे WhatsApp) user की permission से contact list को read कर सकें।


1: अपना खुद का Content Provider बनाना

अपना data दूसरी apps के साथ share करने के लिए, आप अपना खुद का Content Provider बना सकते हैं।

मुख्य Steps:

  1. ContentProvider Class बनाएं: एक नई Java class बनाएं जो `ContentProvider` को extend करती हो।
  2. Contract Class बनाएं: (Optional but recommended) एक contract class बनाएं जो URIs, table names, और column names के लिए constants define करती है।
  3. Methods को Implement करें: `query()`, `insert()`, `update()`, `delete()`, `getType()` and `onCreate()` methods को override और implement करें।
  4. Manifest में Register करें: `AndroidManifest.xml` file में `` tag का उपयोग करके अपने provider को register करें।

Java में उदाहरण: (Topic 21 के DatabaseHelper पर आधारित)

Step 1: ContentProvider Class बनाना


public class UserProvider extends ContentProvider {
    
    // हमारे provider के लिए Authority. यह unique होनी चाहिए।
    public static final String AUTHORITY = "com.example.myapp.UserProvider";
    // Content URI
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/users");
    
    private DatabaseHelper dbHelper;

    @Override
    public boolean onCreate() {
        dbHelper = new DatabaseHelper(getContext());
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        return db.query("users", projection, selection, selectionArgs, null, null, sortOrder);
    }

    // Insert, Update, Delete, getType methods यहाँ implement किए जाएंगे...
    // For simplicity, we are focusing on the query method.
    
    @Override
    public String getType(Uri uri) {
        return null; // Not implemented for this example
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null; // Not implemented for this example
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0; // Not implemented for this example
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0; // Not implemented for this example
    }
}

Step 2: AndroidManifest.xml में Register करना


<application ...>
    ...
    <provider
        android:name=".UserProvider"
        android:authorities="com.example.myapp.UserProvider"
        android:exported="true" /> 
        <!-- exported="true" का मतलब है कि दूसरी apps इसे access कर सकती हैं -->
</application>

2: एक Content Provider का उपयोग करना

दूसरी app से data access करने के लिए, आप `ContentResolver` object का उपयोग करते हैं।

ContentResolver क्या है?

हर application का अपना `ContentResolver` का instance होता है। यह object Content Provider के साथ communicate करने का standard तरीका है। आप `getContentResolver()` method का उपयोग करके इसे प्राप्त करते हैं।

उदाहरण: किसी दूसरे App से Users को Query करना


// यह code एक अलग app में होगा

public class ConsumerActivity extends AppCompatActivity {
    TextView dataTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_consumer);
        dataTextView = findViewById(R.id.data_tv);
    }
    
    public void loadDataFromProvider(View view) {
        // Provider का Content URI
        Uri usersUri = Uri.parse("content://com.example.myapp.UserProvider/users");

        // ContentResolver का उपयोग करके query करें
        ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(usersUri, null, null, null, null);
        
        StringBuilder stringBuilder = new StringBuilder();
        if (cursor != null && cursor.moveToFirst()) {
            do {
                // Column names का उपयोग करके data निकालें
                String name = cursor.getString(cursor.getColumnIndex("name"));
                String email = cursor.getString(cursor.getColumnIndex("email"));
                stringBuilder.append("Name: ").append(name).append(", Email: ").append(email).append("
");
            } while (cursor.moveToNext());
            cursor.close();
        }
        
        dataTextView.setText(stringBuilder.toString());
    }
}

इस तरह, `ConsumerActivity` app `UserProvider` app के data को उसकी permission के बिना access नहीं कर सकती (यदि permissions define की गई हैं), और यह directly database को भी touch नहीं करती, जिससे data sharing सुरक्षित और organized रहती है।