0

I am trying to access to sqlite content to take suggestion in searchview. I'm not able to establish connection between provider and sqlite database.I take illegalArgumentException, uknown uri. What is the exact syntax of content uri for my code.

This is logCat output:

04-27 22:52:33.122: E/AndroidRuntime(1062): FATAL EXCEPTION: main
04-27 22:52:33.122: E/AndroidRuntime(1062): android.database.sqlite.SQLiteException:     near "er": syntax error: , while     compiling:     SELECT _id AS _id, titleid, titlename FROM titles WHERE (titlename LIKE ?     er%) ORDER BY DESC
04-27 22:52:33.122: E/AndroidRuntime(1062):     at     android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at     android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at     android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:127)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:94)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:53)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1564)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:354)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:291)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at com.example.search_deneme.SuggestionProvider.query(SuggestionProvider.java:77)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.content.ContentProvider$Transport.query(ContentProvider.java:178)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.content.ContentResolver.query(ContentResolver.java:310)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at com.example.search_deneme.SearchableActivity.handleIntent(SearchableActivity.java:106)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at com.example.search_deneme.SearchableActivity.onNewIntent(SearchableActivity.java:88)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1123)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.app.ActivityThread.deliverNewIntents(ActivityThread.java:2041)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.app.ActivityThread.performNewIntents(ActivityThread.java:2054)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.app.ActivityThread.handleNewIntent(ActivityThread.java:2063)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.app.ActivityThread.access$1400(ActivityThread.java:122)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1193)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.os.Looper.loop(Looper.java:137)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at android.app.ActivityThread.main(ActivityThread.java:4340)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at java.lang.reflect.Method.invokeNative(Native Method)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at java.lang.reflect.Method.invoke(Method.java:511)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-27 22:52:33.122: E/AndroidRuntime(1062):     at dalvik.system.NativeStart.main(Native Method)

Here is my activity code.Thanks.

public class SearchableActivity extends Activity implements OnQueryTextListener {

DatabaseHandler db;
String query2;
Uri mNewUri;
ContentValues mNewValues = new ContentValues();



public static final String tablePath = "titles";
public static final String AUTHORITY = "com.example.search_deneme.SuggestionProvider";

public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
        + "/" + tablePath);



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.searchlist);
    db = new DatabaseHandler(this, "dbS");
    db.addContact(new Titles(1,1,"erdinc"));
    db.addContact(new Titles(2,1,"erf"));
    db.addContact(new Titles(3,1,"erg"));
    db.addContact(new Titles(4,1,"erh"));

    // Get the intent, verify the action and get the query
    Intent intent = getIntent();
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        query2 = intent.getStringExtra(SearchManager.QUERY);
        handleIntent(getIntent());
        System.out.println(query2);
        // doMySearch(query);
    }




}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // TODO Auto-generated method stub

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.search, menu);

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search)
            .getActionView();
    // Assumes current activity is the searchable activity
    searchView.setSearchableInfo(searchManager
            .getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(true); // Do not iconify the widget;
                                            // expand it by default
    searchView.setQueryRefinementEnabled(true);

    return true;

}

public boolean onSearchRequested() {
    Toast.makeText(SearchableActivity.this, "deneme", Toast.LENGTH_LONG)
            .show();
    return super.onSearchRequested();
}

@Override
protected void onNewIntent(Intent intent) {
    setIntent(intent);
    handleIntent(intent);
}

private void handleIntent(Intent intent) {
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        query2 = intent.getStringExtra(SearchManager.QUERY);

        String[] mProjection = { 
                //CONTENT_URI.getQueryParameter("_ID"),
                //CONTENT_URI.getQueryParameter("_TITLEID"),
                //CONTENT_URI.getQueryParameter("_TITLENAME")
                DatabaseHandler._ID + "AS _id",DatabaseHandler._TITLEID,DatabaseHandler._TITLENAME
        };

        String mSelectionClause = DatabaseHandler._TITLENAME  +  " LIKE ? " + query2 + "%";



        Cursor a = getContentResolver().query(SuggestionProvider.CONTENT_URI, mProjection, mSelectionClause, null , "DESC");
        //Cursor c = db.getWordMatches(query, null);
        int b = a.getColumnCount();
        System.out.println(a.toString() + "      " + b);
        //doMySearch(query);
    }
}

@Override
public boolean onQueryTextSubmit(String query) {
    // TODO Auto-generated method stub
    System.out.println("123");
    return false;
}

@Override
public boolean onQueryTextChange(String newText) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "text", Toast.LENGTH_LONG).show();
    return false;
}

}

This is my suggestion provider class.

public class SuggestionProvider extends ContentProvider {

DatabaseHandler mOpenHelper;
private SQLiteDatabase db;
private String dbName = "dbS";

public static final int A = 1;
public static final int B = 2;
public static final int C = 3;
public static final String tablePath = "titles";

private static final String BASE_PATH = "titles";
public static final String AUTHORITY = "com.example.search_deneme.SuggestionProvider";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
        + "/" + BASE_PATH);
// public static final int MODE = DATABASE_MODE_QUERIES;

private static final String[] COLUMNS = {
        "_id", // must include this column
        SearchManager.SUGGEST_COLUMN_TEXT_1,
        SearchManager.SUGGEST_COLUMN_TEXT_2, };

@Override
public boolean onCreate() {
    // TODO Auto-generated method stub
    mOpenHelper = new DatabaseHandler(getContext(), dbName);

    return true;

}

private static final UriMatcher sURIMatcher = new UriMatcher(
        UriMatcher.NO_MATCH);
static {
    sURIMatcher.addURI(AUTHORITY, BASE_PATH, A);
    sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/#", B);
    sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/", C);
}

@Override
public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {

    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    queryBuilder.setTables(tablePath);
    int uriType = sURIMatcher.match(uri);
    switch (uriType) {
    case B:
        queryBuilder.appendWhere(mOpenHelper._ID + "="
                + uri.getLastPathSegment());
        break;
    case A:// no filter
        break;
    case C:
        queryBuilder.appendWhere(mOpenHelper._TITLENAME+ "="
                + uri.getLastPathSegment());
//          break;
    default:
        throw new IllegalArgumentException("Unknown URI" + uri);

    }
    Cursor cursor = queryBuilder.query(mOpenHelper.getReadableDatabase(),
            projection, selection, selectionArgs, null, null, sortOrder);
    cursor.setNotificationUri(getContext().getContentResolver(), uri);
    return cursor;

    // TODO Auto-generated method stub

}

@Override
public String getType(Uri uri) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
    // TODO Auto-generated method stub

    db = mOpenHelper.getWritableDatabase();
    return null;
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public int update(Uri uri, ContentValues values, String selection,
        String[] selectionArgs) {
    // TODO Auto-generated method stub
    return 0;
}

}

And here how i create my database table.

public class DatabaseHandler extends SQLiteOpenHelper {

// All Static variables
// Database Version
public static final int DATABASE_VERSION = 1;

// Database Name
public static final String DATABASE_NAME = "suggestionManager";

// Contacts table name
public static final String TABLE_SUGGESTIONS = "titles";

public static final String _ID = "_id";
public static final String _TITLEID = "titleid";
public static final String _TITLENAME = "titlename";

public DatabaseHandler(Context context, String db) {
    super(context, db, null, DATABASE_VERSION);
}

// Creating TablesS
@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_CONTACTS_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_SUGGESTIONS + "("
            + _ID + " INTEGER PRIMARY KEY," + _TITLEID + " INTEGER,"
            + _TITLENAME + " TEXT" + ")";
    db.execSQL(CREATE_CONTACTS_TABLE);
}

// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // Drop older table if existed
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_SUGGESTIONS);

    // Create tables again
    onCreate(db);
}

/**
 * All CRUD(Create, Read, Update, Delete) Operations
 */

// Adding new contact
void addContact(Titles title) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(_ID, title.getID()); // Contact Name
    values.put(_TITLENAME, title.getTitleName()); // Contact Name
    values.put(_TITLEID, title.getTitleID()); // Contact Phone

    // Inserting Row
    db.insert(TABLE_SUGGESTIONS, null, values);
    db.close(); // Closing database connection
}

// Getting single contact
Titles getTitle(int id) {
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.query(TABLE_SUGGESTIONS, new String[] { _ID,
            _TITLEID, _TITLENAME }, _ID + "=?",
            new String[] { String.valueOf(id) }, null, null, null, null);
    if (cursor != null)
        cursor.moveToFirst();

    Titles title = new Titles(cursor.getInt(0),
            cursor.getInt(1), cursor.getString(2));
    // return contact
    return title;
}

// Getting All Contacts
public List<Titles> getAllContacts() {
    List<Titles> contactList = new ArrayList<Titles>();
    // Select All Query
    String selectQuery = "SELECT  * FROM " + TABLE_SUGGESTIONS;

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            Titles contact = new Titles();
            contact.setID(cursor.getInt(0));
            contact.setTitleID(cursor.getInt(1));
            contact.setTitleName(cursor.getString(2));
            // Adding contact to list
            contactList.add(contact);
        } while (cursor.moveToNext());
    }

    // return contact list
    return contactList;
}

// Updating single contact
public int updateContact(Titles title) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(_TITLEID, title.getTitleID());
    values.put(_TITLENAME, title.getTitleName());

    // updating row
    return db.update(TABLE_SUGGESTIONS, values, _ID + " = ?",
            new String[] { String.valueOf(title.getID()) });
}

// Deleting single contact
public void deleteContact(Titles contact) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_SUGGESTIONS, _ID + " = ?",
            new String[] { String.valueOf(contact.getID()) });
    db.close();
}

// Getting contacts Count
public int getContactsCount() {
    String countQuery = "SELECT  * FROM " + TABLE_SUGGESTIONS;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(countQuery, null);
    cursor.close();

    // return count
    return cursor.getCount();
}

}

4

1 回答 1

3

你把提供者放在你的清单中了吗?

<provider

   android:authorities="com.yourpackagename.SuggestionsProvider"

   android:name=".SuggestionsProvider" >

</provider>

你可以试试这个:

在您的数据库类中重命名: public static final String _ID = "id"; to public static final String _ID = "_id";因为我相信 _id 是 Android 中的自定义。

你能像这样写你的投影,看看它是否也有什么不同(其中 MYDATABASECLASS 是你的数据库 JAVA 类的名称:

String[] mProjection = { MYDATABASECLASS._ID,MYDATABASECLASS._TITLEID,MYDATABASECLASS._TITLENAME };

String mSelectionClause = MYDATABASAECLASS._TITLENAME  +  "LIKE ?";

并在您的数据库类中重命名:

public static final String _ID = "id"; to public static final String _ID = "_id";因为我相信 _id 是Android中的自定义。

你能检查以下是否正确? queryBuilder.setTables(mOpenHelper.getDatabaseName());

不是应该是你的表名吗?所以试试 queryBuilder.setTables(tablePath);

于 2013-04-27T16:20:02.507 回答