Κοινή χρήση τεχνολογίας

Βασικά στοιχεία βάσης δεδομένων Android

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Πίνακας περιεχομένων

1. Μέθοδος αποθήκευσης δεδομένων Android

2. Συναλλαγές βάσης δεδομένων

Χαρακτηριστικά συναλλαγών βάσης δεδομένων (ACID)

επίπεδο απομόνωσης συναλλαγής

περίληψη συναλλαγής

3, ContetProvider

αποτέλεσμα

Επεξεργασία

URI Uniform Resource Identifier

Επεξεργασία

Τύπος MIME

Κύρια μέθοδος ContentProvider

4, ContentResolver

αποτέλεσμα

κύρια μέθοδος

Περιπτώσεις χρήσης

Βοηθητικά εργαλεία

ContentUris

UriMatcher

ContentObserver


1. Μέθοδος αποθήκευσης δεδομένων Android

  • SharedPreference
  • Αποθήκευση αρχείων
  • SQLite
  • Αποθήκευση δικτύου

2. Συναλλαγές βάσης δεδομένων

Χαρακτηριστικά συναλλαγών βάσης δεδομένων (ACID)

  • Ατομικότητα: Μια συναλλαγή περιλαμβάνει όλες τις λειτουργίες που είτε επιτυγχάνουν είτε επαναφέρονται στην αρχική κατάσταση.
  • Συνέπεια: Η κατάσταση της βάσης δεδομένων παραμένει σταθερή πριν και μετά την εκτέλεση της συναλλαγής
  • Απομόνωση: Πολλοί χρήστες έχουν πρόσβαση στη βάση δεδομένων ταυτόχρονα και πολλές συναλλαγές δεν επηρεάζουν η μία την άλλη.
  • Ανθεκτικότητα: Μόλις δεσμευτεί μια συναλλαγή, τα δεδομένα στη βάση δεδομένων τροποποιούνται μόνιμα.

επίπεδο απομόνωσης συναλλαγής

  • Διαβάστε αδέσμευτα
  • Ανάγνωση δεσμευμένη: αποφύγετε τις βρώμικες αναγνώσεις (ανάγνωση μη δεσμευμένων δεδομένων)
  • Επαναληψιμότητα: Αποφύγετε τις μη επαναλαμβανόμενες αναγνώσεις (για την τρέχουσα συναλλαγή, ακόμα κι αν τα δεδομένα προέλευσης τροποποιηθούν από άλλη συναλλαγή, τα δεδομένα που βλέπει εξακολουθούν να είναι η κατάσταση στην αρχή της συναλλαγής)
  • Σειριοποίηση: Αποφύγετε τις φανταστικές αναγνώσεις (αφού ξεκινήσει μια συναλλαγή και διαβάσει τα δεδομένα, μια άλλη συναλλαγή εισάγει μια νέα εγγραφή, έτσι ώστε η πρώτη συναλλαγή να δει νέα δεδομένα που δεν έχουν αναγνωσθεί πριν σε επόμενες λειτουργίες. )

περίληψη συναλλαγής

3, ContetProvider

αποτέλεσμα

  • Η βασική αρχή είναι η χρήση του μηχανισμού Binder
  • Παρέχει μια ενοποιημένη διεπαφή για την αποθήκευση και την ανάκτηση δεδομένων, επιτρέποντας την κοινή χρήση δεδομένων μεταξύ των εφαρμογών
  • Τα δεδομένα σε διαφορετικούς ContentProviders μπορούν να χειριστούν μέσω URI
  • Οι εξωτερικές διεργασίες μπορούν να αλληλεπιδράσουν με το ContentProvider μέσω της κλάσης ContentResolver

  • Αλληλεπίδραση και κοινή χρήση δεδομένων μεταξύ διεργασιών για την επίτευξη επικοινωνίας μεταξύ διεργασιών
  • Το ContentProvider είναι ισοδύναμο με έναν αχθοφόρο Η πραγματική πηγή δεδομένων είναι η βάση δεδομένων, το αρχείο, το XML και το δίκτυο.

URI Uniform Resource Identifier

Μοναδική αναγνώριση δεδομένων στο ContentProvider

Τύπος MIME

Καθορίστε ένα αρχείο με συγκεκριμένη επέκταση για άνοιγμα με μια συγκεκριμένη εφαρμογή

Σύνθεση τύπου MIME = τύπος + υποτύπος

αρέσει:

  • κείμενο/html
  • κείμενο/xml
  • κείμενο/css
  • εφαρμογή/pdf

Φόρμα τύπου MIME

Κύρια μέθοδος ContentProvider

//外部进程向ContentProvider中添加数据
fun insert(uri:Uri,contentValues values):Uri
//外部进程删除ContentProvider中数据
fun delete(uri:Uri,selection:String,selectionArgs:String[]):Int
//外部进程更新ContentProvider中数据
fun update(uri:Uri,values:ContentValues,selection:String,selectionArgs:String[]):int
//外部应用获取ContentProvider中数据
fun query (uri:Uri,projection:String[],selection:String,selectionArgs:String[],sortOrder:String):Cursor

4, ContentResolver

αποτέλεσμα

Τα δεδομένα σε διαφορετικούς ContentProviders μπορούν να χειριστούν μέσω URI

Οι εξωτερικές διεργασίες αλληλεπιδρούν με το ContentProvider μέσω του ContentResolver

Ενιαία διαχείριση όλων των ContentProviders

κύρια μέθοδος

ContentResolverτάξη παρέχειContentProvider4 μέθοδοι με το ίδιο όνομα & συνάρτηση στην τάξη

//外部进程向ContentProvider中添加数据
fun insert(uri:Uri,contentValues values):Uri
//外部进程删除ContentProvider中数据
fun delete(uri:Uri,selection:String,selectionArgs:String[]):Int
//外部进程更新ContentProvider中数据
fun update(uri:Uri,values:ContentValues,selection:String,selectionArgs:String[]):int
//外部应用获取ContentProvider中数据
fun query (uri:Uri,projection:String[],selection:String,selectionArgs:String[],sortOrder:String):Cursor

Περιπτώσεις χρήσης

val resolver = getContentResolver()
val uri = Uri.parse("content://cn.scu.myprovider/user")

val cursor:Cursor = resolver.query(uri,null,null,null,"userid desc")

Βοηθητικά εργαλεία

ContentUris

Προσθήκη και λήψη αναγνωριστικού στο URI

// withAppendedId()作用:向URI追加一个id
Uri uri = Uri.parse("content://cn.scu.myprovider/user") 
Uri resultUri = ContentUris.withAppendedId(uri, 7);  
// 最终生成后的Uri为:content://cn.scu.myprovider/user/7

// parseId()作用:从URL中获取ID
Uri uri = Uri.parse("content://cn.scu.myprovider/user/7") 
long personid = ContentUris.parseId(uri); 
//获取的结果为:7

UriMatcher

Καταχωρίστε το URI στο ContentProvider, επιστρέψτε τον κωδικό εγγραφής σύμφωνα με το URI και αντιστοιχίστε τον αντίστοιχο πίνακα δεδομένων στο ContentProvider

// 步骤1:初始化UriMatcher对象
    UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); 
    //常量UriMatcher.NO_MATCH  = 不匹配任何路径的返回码
    // 即初始化时不匹配任何东西

// 步骤2:在ContentProvider 中注册URI(addURI())
    int URI_CODE_a = 1;
    int URI_CODE_b = 2;
    matcher.addURI("cn.scu.myprovider", "user1", URI_CODE_a); 
    matcher.addURI("cn.scu.myprovider", "user2", URI_CODE_b); 
    // 若URI资源路径 = content://cn.scu.myprovider/user1 ,则返回注册码URI_CODE_a
    // 若URI资源路径 = content://cn.scu.myprovider/user2 ,则返回注册码URI_CODE_b

// 步骤3:根据URI 匹配 URI_CODE,从而匹配ContentProvider中相应的资源(match())

@Override   
    public String getType(Uri uri) {   
      Uri uri = Uri.parse(" content://cn.scu.myprovider/user1");   

      switch(matcher.match(uri)){   
     // 根据URI匹配的返回码是URI_CODE_a
     // 即matcher.match(uri) == URI_CODE_a
      case URI_CODE_a:   
        return tableNameUser1;   
        // 如果根据URI匹配的返回码是URI_CODE_a,则返回ContentProvider中的名为tableNameUser1的表
      case URI_CODE_b:   
        return tableNameUser2;
        // 如果根据URI匹配的返回码是URI_CODE_b,则返回ContentProvider中的名为tableNameUser2的表
    }   
}

ContentObserver

Παρατηρήστε τις αλλαγές δεδομένων στο ContentProvider που προκαλούνται από URI και ειδοποιήστε τους επισκέπτες

// 步骤1:注册内容观察者ContentObserver
    getContentResolver().registerContentObserver(uri);
    // 通过ContentResolver类进行注册,并指定需要观察的URI

// 步骤2:当该URI的ContentProvider数据发生变化时,通知外界(即访问该ContentProvider数据的访问者)
    public class UserContentProvider extends ContentProvider { 
      public Uri insert(Uri uri, ContentValues values) { 
      db.insert("user", "userid", values); 
      getContext().getContentResolver().notifyChange(uri, null); 
      // 通知访问者
   } 
}

// 步骤3:解除观察者
 getContentResolver().unregisterContentObserver(uri);
    // 同样需要通过ContentResolver类进行解除