1

i have looked at many examples for content provider. and when the database is created the table name does not match. in the example below the table is declared as "Country" in the creation of the SQLite database

  public static final String SQLITE_TABLE = "Country";

however, the table name is described as "countries" in the URI

  // create content URIs from the authority by appending path to database table
  public static final Uri CONTENT_URI = 
  Uri.parse("content://" + AUTHORITY + "/countries");

the table name is after the authority in the URI, so in this example the table name is supposed to be "countries", that is different from what is declared during the creation of the database

which of these is the correct table name, Country or countries?

 public class MyContentProvider extends ContentProvider{

  private MyDatabaseHelper dbHelper;

 private static final int ALL_COUNTRIES = 1;
 private static final int SINGLE_COUNTRY = 2;

// authority is the symbolic name of your provider
// To avoid conflicts with other providers, you should use 
// Internet domain ownership (in reverse) as the basis of your provider authority. 
private static final String AUTHORITY = "com.as400samplecode.contentprovider";

// create content URIs from the authority by appending path to database table
public static final Uri CONTENT_URI = 
 Uri.parse("content://" + AUTHORITY + "/countries");

// a content URI pattern matches content URIs using wildcard characters:
// *: Matches a string of any valid characters of any length.
// #: Matches a string of numeric characters of any length.
private static final UriMatcher uriMatcher;
static {
 uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
 uriMatcher.addURI(AUTHORITY, "countries", ALL_COUNTRIES);
 uriMatcher.addURI(AUTHORITY, "countries/#", SINGLE_COUNTRY);
}


 public class CountriesDb {

 public static final String KEY_ROWID = "_id";
 public static final String KEY_CODE = "code";
 public static final String KEY_NAME = "name";
 public static final String KEY_CONTINENT = "continent";

 private static final String LOG_TAG = "CountriesDb";
 public static final String SQLITE_TABLE = "Country";

  private static final String DATABASE_CREATE =
  "CREATE TABLE if not exists " + SQLITE_TABLE + " (" +
  KEY_ROWID + " integer PRIMARY KEY autoincrement," +
  KEY_CODE + "," +
  KEY_NAME + "," +
  KEY_CONTINENT + "," +
 " UNIQUE (" + KEY_CODE +"));";

  public static void onCreate(SQLiteDatabase db) {
  Log.w(LOG_TAG, DATABASE_CREATE);
  db.execSQL(DATABASE_CREATE);
  }

   public static void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   Log.w(LOG_TAG, "Upgrading database from version " + oldVersion + " to "
   + newVersion + ", which will destroy all old data");
   db.execSQL("DROP TABLE IF EXISTS " + SQLITE_TABLE);
   onCreate(db);
  }

 }
4

1 回答 1

0

我看不出这段代码有问题

内容提供者只是该数据库表的公共接口。这些条款不必完全匹配。

将表名设为单数是一种标准做法。使基于表名复数的函数也是一种常见的做法。有时,这甚至是由代码生成器自动完成的。

然而,对于来自 Content Providers 的 SQLite 和 Android uri,我们的工具并没有那么复杂。这就是为什么在 uriMatcher 的第二行中,使用的措辞对我们人类来说真的没有多大意义:

uriMatcher.addURI(AUTHORITY, "countries/#", SINGLE_COUNTRY);
于 2013-05-08T00:27:06.890 回答