我查看了许多内容提供商的示例。并且在创建数据库时,表名称不匹配。在下面的示例中,表在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”,这与创建数据库期间声明的名称不同
其中哪一个是正确的表名Country
或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);
}
}
答案 0 :(得分:0)
我认为此代码没有问题
内容提供程序只是该数据库表的公共接口。这些条款不必完全匹配。
将表名称设为单数是一种标准做法。基于表名复数的函数也是常见的做法。有时,这甚至由代码生成器自动完成。
对于Content Providers的SQLite和Android uris,我们的工具并不复杂。这就是为什么在uriMatcher的第二行中,使用的措辞对我们人类来说真的没有多大意义:
uriMatcher.addURI(AUTHORITY, "countries/#", SINGLE_COUNTRY);