2017-01-01 49 views
1

我有一个错误,当我尝试使用ListAdapter在片段类阅读我的数据库。我觉得这是不是一个严重的错误,解决并没有太多的代码来检查,但我不知道为什么我得到这个错误:“java.lang.IllegalArgumentException异常:列‘主题’不存在”。 我在我的片段类函数databaseView()应该读我的数据库,所以我做了一个请求,让所有的数据,所以我应该得到的所有列。的Android Contente提供程序错误:“java.lang.IllegalArgumentException异常:列‘主题’不存在”

我甚至可以用我的内容提供商加入我的数据库中的新条目(从另一个片段类),我与铬“sqliteviewer”检查,它工作得很好。

创建我的数据库有此要求:

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

这里是我的片段类:

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类

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; 
} 
} 

感谢您的帮助,对不起,如果英语不好。

+0

什么是您的数据库模式,列'表'存在? –

+0

无我有5列: _id,主题,问题,作出反应并difficulte的 –

回答

1

我觉得你的问题是区分大小写

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

你申报你的表是这样的:

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"; 
+0

啊谢谢!我不知道为什么我确定当你有大写或没有SQL请求时没有区别。所以我把所有的列大写,它的作品!这真是一个愚蠢的错误...... –

相关问题