我正在通过这个Android SQLite教程工作。
我已经让它正常工作了,但是在9.4节中,我们构建了一个扩展ContentProvider的类。如果您查看UriMatcher声明和实例化的位置,您将看到一个静态代码块。
static {
sURIMatcher.addURI(AUTHORITY, BASE_PATH, TODOS);
sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/#", TODO_ID);
}我猜这是因为UriMatcher本身被声明为静态的。对吗?为什么静态代码块中的这两行代码不能在onCreate方法中调用?最后,像这样的静态代码块的一般用途是什么?
这里有一个更大的部分,用于某些上下文:
public class MyTodoContentProvider extends ContentProvider {
// database
private TodoDatabaseHelper database;
// used for the UriMacher
private static final int TODOS = 10;
private static final int TODO_ID = 20;
private static final String AUTHORITY = "de.vogella.android.todos.contentprovider";
private static final String BASE_PATH = "todos";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
+ "/" + BASE_PATH);
public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE
+ "/todos";
public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE
+ "/todo";
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sURIMatcher.addURI(AUTHORITY, BASE_PATH, TODOS);
sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/#", TODO_ID);
}
@Override
public boolean onCreate() {
database = new TodoDatabaseHelper(getContext());
return false;
}发布于 2014-08-19 11:27:38
静态代码块在初始化类时只执行一次,即加载之后。但
static {
sURIMatcher.addURI(AUTHORITY, BASE_PATH, TODOS);
sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/#", TODO_ID);
}无论何时调用onCreate()都不会执行,因为类已经初始化了。
发布于 2014-08-19 11:26:52
静态变量用于静态上下文,即静态块或静态方法。本教程的作者创建了一个静态块,它将在类初始化时调用(而不是在方法中显式调用),而不是创建一个必须调用的静态方法。
发布于 2014-08-19 11:27:49
静态块在第一次使用类时只执行一次。当不需要对每个新实例执行代码时,您可以将代码放入静态块中。
https://stackoverflow.com/questions/25382143
复制相似问题