2011-11-06 85 views
0

===关于我===Android:创建有效的内容提供商URI的问题

我是新来的android开发人员,几乎不能“说出”Java。不过,我在PHP5和C++ C++/CLI(.net> 2.0)方面经验丰富,所以我希望我能够创建这个小应用程序,这是我的想法。

但经过几天的试验,我现在处于一种陷阱,希望你能帮助我。

===有关项目===

我有一个列表视图(嵌套在其他布局内),并尝试从一个SQLite数据来填充它。我设法使用一个简单的“arrayAdapter”来启动并运行,但是研究如果我使用弹出窗口在数据库中插入新元素,我可以更新它,但我发现需要实现自己的内容提供者。

===这个问题===

我浏览了几个教程和这样做,但现在我有称这是因为URI的问题。我不明白它应该如何创建,所以我不能创建一个有效的。

这里是代码的问题:

TBTTManageBudgetsActivity.java

package com.TBTT; 

// ... 
// some imports 
// ... 

public class TBTTManageBudgetsActivity extends Activity { 
    // ... 
    // some declarations 
    // ... 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // Initialisation 
      super .onCreate(savedInstanceState); 
      setContentView(R.layout.manage_budgets); 

     // ... 
     // some stuff concerning other elements 
     // ... 

    // Fill List View 
     // Get the list view 
      ListView listView = (ListView) findViewById(R.id.list_box);  
      // Get content provider and cursor 
       String[] projection = { TBTCPHBudget.KEY_ROWID, TBTCPHBudget.KEY_NAME }; 
       String[] uiBindFrom = { TBTCPHBudget.KEY_ROWID}; 
       int[] uiBindTo = { R.id.name };    
       TBTCPBdugets ContentProvider = new TBTCPBdugets();   
       Cursor cursor = ContentProvider.query(TBTCPBdugets.CONTENT_URI, projection,null, null, null);    
      // Let activity manage the cursor 
       startManagingCursor(cursor); 
      // Get value from content provider 
       cursor.moveToFirst(); 
       ArrayList list = new ArrayList<String>(); 
       do { 
        list.add(cursor.getString(1)); 
       } while (cursor.moveToNext()); 
      // Set Values with Adapter 
       CursorAdapter adapter = new SimpleCursorAdapter(this.getApplicationContext(), R.layout.list_budgets_item, cursor, uiBindFrom, uiBindTo); 
       listView.setAdapter(adapter);    
    } 

    // ... 
    // some other functions 
    // ... 
} 

TBTCPBdugets.java

package com.TBTT; 
// ... 
// some imports 
// ... 

public class TBTCPBdugets extends ContentProvider { 
    // ... 
    // some declarations 
    // ... 
    public static final String AUTHORITY = "com.TBTT"; 
    public static final String DATAPATH = "TBTCPHBudget"; 
    public static final Uri CONTENT_URI = Uri.parse("content://"+ AUTHORITY+"/" + DATAPATH); 
    private static final UriMatcher sUriMatcher; 

    private static class DatabaseHelper extends SQLiteOpenHelper { 
     // ... 
     // some other functions 
     // ... 
    } 

    private DatabaseHelper dbHelper; 

    // ... 
    // some other functions 
    // ... 

    @Override 
    public boolean onCreate() { 
     dbHelper = new DatabaseHelper(getContext()); 
     return true; 
    } 

    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
     SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 
     switch (sUriMatcher.match(uri)) {   
      case BUDGETS:    
       qb.setTables(BUDGETS_TABLE_NAME);    
       qb.setProjectionMap(notesProjectionMap); 
       break; 
     default:    
      Log.d(TAG, "Unknown URI " + uri+" with URIMatcher Result "+sUriMatcher.match(uri));    
      throw new IllegalArgumentException("Unknown URI " + uri); 
     } 

     SQLiteDatabase db = dbHelper.getReadableDatabase(); 
     Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder); 

     c.setNotificationUri(getContext().getContentResolver(), uri); 
     return c; 
    } 

    static { 
     sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 
     sUriMatcher.addURI(AUTHORITY, BUDGETS_TABLE_NAME, BUDGETS); 

     // ... 
     // some declarations 
     // ... 
    } 
} 

当我运行这一点,打开TBTTManageBudgetsActivity程序会崩溃。来自TBTCPBdugets.java的调试输出显示:“未知的URI内容://com.TBTT/TBTCPBdugets with URIMatcher Result -1”。

有人可以告诉我,请问如何为此创建VALID URI?

回答

1

您的UriMatcher不知道您的CONTENT_URI。 CONTENT_URI中有DATAPATH,但匹配器中有BUDGETS_TABLE_NAME。

+0

与荷马辛普森说:“哦!” 这就是问题所在。非常感谢! – HOK