Android Contente provider error : " java.lang.IllegalArgumentException: column 'theme' does not exist"

Android Contente provider error : " java.lang.IllegalArgumentException: column 'theme' does not exist"

当我尝试使用 ListAdapter 读取片段 Class 中的数据库时出现错误。我觉得这不是一个很难解决的错误,也没有太多代码可以检查,但我不知道为什么会出现此错误:"java.lang.IllegalArgumentException: column 'theme' does not exist"。 我的片段 class 中的函数 databaseView() 应该读取我的数据库,所以我请求获取所有数据,所以我应该获取所有列。

我什至可以通过我的内容提供商在我的数据库中添加一个新条目(来自另一个片段 Class),我在 chrome 上使用 "sqliteviewer" 进行了检查,它运行良好。

我根据这个请求创建了我的数据库:

"create table "+ STOCK_TABLE + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, THEME TEXT, QUESTION TEXT, REPONSE TEXT, DIFFICULTE FLOAT)"

这是我的片段 class :

public class ViewCardEditor extends Fragment {
StockCard stock;
ViewGroup container;
ListView listView;
SimpleCursorAdapter cursorAdapter;




@Override
public View onCreateView(LayoutInflater inflater, ViewGroup c,
                         Bundle savedInstanceState) {
    container = c;
    View view = inflater.inflate(R.layout.fragment_view_card_editor, container, false);


    // Inflate the layout for this fragment
    if (container != null) {
        container.removeAllViews();
    }
    listView = (ListView) view.findViewById(R.id.listView);
    stock = new StockCard(c.getContext());


    databaseView();
    return view;
}

public void databaseView()
{
    ArrayList<String> list = new ArrayList<>();
    Cursor cursor = stock.getData();

    if(cursor.getCount() == 0)
    {
        Toast.makeText(container.getContext(), "Aucunes cartes en stock !!", Toast.LENGTH_LONG).show();
    }
    else
    {
        while(cursor.moveToNext())
        {
            list.add(cursor.getString(0));
            list.add(cursor.getString(1));
            list.add(cursor.getString(2));
            list.add(cursor.getString(3));
            list.add(cursor.getString(4));

//HERE is where I get my exception :            
ListAdapter adapter = new SimpleCursorAdapter(container.getContext(),
                    R.layout.card_stock,
                    cursor,
                    new String[]{stock._ID,
                            stock.THEME,
                            stock.QUESTION,
                            stock.REPONSE,
                            stock.DIFFICULTE},
                    new int[]{R.id.idList, R.id.themeList, R.id.questionList, R.id.reponseList, R.id.difficultList}, 0);

            listView.setAdapter(adapter);
        }
    }

}

}

还有我的 SQLiteOpenHelper class

public class StockCard extends SQLiteOpenHelper {
public static final String STOCK_NAME ="StockCard.db";
public static final String STOCK_TABLE = "Carte_table";
private static int VERSION = 1;

public static final String _ID = "_id";
public static final String THEME = "theme";
public static final String QUESTION = "question";
public static final String REPONSE = "reponse";
public static final String DIFFICULTE = "difficulte";

private static StockCard instance;

//Constructeur pour AddCardEditor (Fragment de CardEditor) et ses fonctions
public StockCard(Context context) {
    super(context, STOCK_NAME, null, VERSION);
    //SQLiteDatabase db = this.getWritableDatabase();
}

public static StockCard getInstance(Context context) {
    if( instance == null ){
        instance = new StockCard(context);
    }
    return instance;
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table "+ STOCK_TABLE + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, THEME TEXT, QUESTION TEXT, REPONSE TEXT, DIFFICULTE FLOAT)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if(newVersion > oldVersion)
    {
        db.execSQL("DROP TABLE IF EXISTS "+STOCK_TABLE);
        onCreate(db);
    }

}

public Cursor getData()
{
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor data = db.rawQuery("select * from "+STOCK_TABLE, null);

    return data;
}

}

然后是我的 ContentProvider:

public class CardContentProvider extends ContentProvider {
private StockCard stock;

public static String authority = "com.example.jean.cartememoire.CardContentProvider";
private static String path ="Carte_table";

public static final String _ID = "_id";
public static final String THEME = "theme";
public static final String QUESTION = "question";
public static final String REPONSE = "reponse";
public static final String DIFFICULTE = "difficulte"; //# = un chiffre
public static final String STOCK_TABLE = "Carte_table";

private static final int ID_STOCK_TABLE = 1;
private static final int ID_THEME = 2;
private static final int ID_QUESTION = 3;
private static final int ID_REPONSE = 4;
private static final int ID_DIFFICULTE = 5;
private static final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);

static {
    matcher.addURI(authority, STOCK_TABLE, ID_STOCK_TABLE);
    matcher.addURI(authority, THEME, ID_THEME);
    matcher.addURI(authority, QUESTION, ID_QUESTION);
    matcher.addURI(authority, REPONSE, ID_REPONSE);
    matcher.addURI(authority, DIFFICULTE, ID_DIFFICULTE);

}


@Override
public boolean onCreate() {
    stock = StockCard.getInstance(getContext());
    return true;
}

@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    SQLiteDatabase db = stock.getReadableDatabase();
    int code = matcher.match(uri);
    long id;
    Cursor cursor;

    switch (code)
    {
        case ID_STOCK_TABLE:
            cursor = db.query(STOCK_TABLE, projection, selection,
                    selectionArgs, null, null, sortOrder);
            break;
        default:
            Log.d("Uri provider =", uri.toString());
            throw new UnsupportedOperationException("Pas encore implémenté");
    }

    return cursor;
}

@Nullable
@Override
public String getType(Uri uri) {
    return null;
}

@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
    SQLiteDatabase db = stock.getWritableDatabase();
    int code = matcher.match(uri);
    long id;
    Uri.Builder builder = new Uri.Builder();

    switch(code)
    {
        case ID_STOCK_TABLE:
            System.out.println(values.toString());
            id = db.insert(STOCK_TABLE, null, values);
            builder.appendPath(STOCK_TABLE);
            break;
        default:
            throw new UnsupportedOperationException("Pas encore implémenté");
    }

    builder.authority(authority);
    builder = ContentUris.appendId(builder, id);

    return builder.build();
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
    return 0;
}

@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    return 0;
}
}

感谢您的帮助,如果英语不好请见谅。

我认为你的问题是区分大小写

https://code.google.com/p/android/issues/detail?id=42636

你这样声明你的table:

 db.execSQL("create table "+ STOCK_TABLE + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, THEME TEXT, QUESTION TEXT, REPONSE TEXT, DIFFICULTE FLOAT)");

即列名 = THEME

但随后您尝试使用以下方式访问它:

public static final String THEME = "theme";

即列名 = theme


CursorAdapter内。更改一个以匹配另一个,看看它是否有效。例如,更改 CardContentProvider 是最简单的:

public static final String THEME = "THEME";