这个内容提供商的正确表名是什么? Android的

时间:2013-05-08 00:19:14

标签: android sqlite android-contentprovider

我查看了许多内容提供商的示例。并且在创建数据库时,表名称不匹配。在下面的示例中,表在SQLite数据库的创建中被声明为“Country”

  public static final String SQLITE_TABLE = "Country";

但是,表名称在URI

中被描述为“国家/地区”
  // create content URIs from the authority by appending path to database table
  public static final Uri CONTENT_URI = 
  Uri.parse("content://" + AUTHORITY + "/countries");

表名在URI中的权限之后,因此在此示例中,表名应该是“countries”,这与创建数据库期间声明的名称不同

其中哪一个是正确的表名Countrycountries

 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);
  }

 }

1 个答案:

答案 0 :(得分:0)

我认为此代码没有问题

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

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

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

uriMatcher.addURI(AUTHORITY, "countries/#", SINGLE_COUNTRY);