Je crois que vous problème est que de toute façon vous avez réellement stocké un blob dans COLUMN_TYPE.
SQLite est assez flexible, y compris la capacité de stocker tout type de données partout (excpetion ci-dessous) par: -
Remarque! la méthode du curseur getString
lancera une exception si elle est utilisée pour essayer d'obtenir un blob, donc dans ce cas, la valeur est indiquée comme impossible à obtenir
En bref, vous pouvez voir comment dynamique les types de colonnes sont et que ce que vous spécifiez lorsque vous créez la table n'est pas un disque dur et rapide (type statique).
Pour ce qui précède, j'utilisé ce qui suit dans un DBHelper: -
public class DBHelper extends SQLiteOpenHelper {
private static final String DBNNAME = "mydatabase";
private static final int DBVESRION = 1;
private static final String TABLENAME = "table1";
private static final String IDCOLUMN = "_id";
private static final String TYPECOLUMN = "type";
private static final String ALT1COLUMN = "alt1";
private static final String NAMECOLUMN = "name";
private static final String LINKCOLUMN = "link";
private static final String IMAGECOLUMN = "image";
DBHelper(Context context) {
super(context, DBNNAME, null, DBVESRION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String crtsql = "CREATE TABLE " + TABLENAME + "(" +
IDCOLUMN + " INTEGER PRIMARY KEY, " +
TYPECOLUMN + " INTEGER NOT NULL DEFAULT 0, " +
ALT1COLUMN + " BLOB, " +
NAMECOLUMN + " TEXT NOT NULL, " +
LINKCOLUMN + " TEXT NOT NULL, " +
IMAGECOLUMN + " BLOB" +
")";
Log.d("TBCRT",crtsql);
db.execSQL(crtsql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion){
}
..... (plus à venir)
Le code ci-dessus la création de la base de données et la seule table selon : -
CREATE TABLE table1(_id INTEGER PRIMARY KEY, type INTEGER NOT NULL DEFAULT 0, alt1 BLOB, name TEXT NOT NULL, link TEXT NOT NULL, image BLOB)
Le code ci-dessus étant suivi par 3 méthodes: -
insertRow
- d'insérer une ligne comme le ferait généralement.
public void insertRow(int type, int alt, String name, String link, byte[] image) {
ContentValues cv = new ContentValues();
cv.put(TYPECOLUMN,type);
cv.put(ALT1COLUMN,alt);
cv.put(NAMECOLUMN,name);
cv.put(LINKCOLUMN,link);
cv.put(IMAGECOLUMN,image);
this.getWritableDatabase().insert(TABLENAME,null,cv);
}
insertAlternativeRow
pour insérer des lignes avec des types forcés.
public void insertAlternativeRow() {
ContentValues cv = new ContentValues();
cv.put(TYPECOLUMN,new byte[]{100,100,100,100,100});
cv.put(ALT1COLUMN,new byte[]{25,25,25,25,25,25,67,45,23,43,17,89,56,34,32,111,21,31,41,51,61,71,81,91,
25,25,25,25,25,67,45,23,43,17,89,56,34,32,111,21,31,41,51,61,71,81,91,
25,25,25,25,25,67,45,23,43,17,89,56,34,32,111,21,31,41,51,61,71,81,91
,25,25,25,25,25,67,45,23,43,17,89,56,34,32,111,21,31,41,51,61,71,81,91
,25,25,25,25,25,67,45,23,43,17,89,56,34,32,111,21,31,41,51,61,71,81,91
,25,25,25,25,25,67,45,23,43,17,89,56,34,32,111,21,31,41,51,61,71,81,91
,25,25,25,25,25,67,45,23,43,17,89,56,34,32,111,21,31,41,51,61,71,81,91});
cv.put(NAMECOLUMN,Long.toString(System.currentTimeMillis()));
cv.put(LINKCOLUMN,Long.toBinaryString(System.currentTimeMillis()));
cv.put(IMAGECOLUMN,2.45678d);
this.getWritableDatabase().insert(TABLENAME,null,cv);
}
viewRowsWithTypes
à des lignes de sortie avec le nom de la colonne, la valeur stockée et les types de colonnes que par la fonction typeof
.
public Cursor viewRowsWithTypes() {
return this.getWritableDatabase().query(TABLENAME,
new String[] {
"*, " +
"typeof(" + TYPECOLUMN + ") AS TYPE_TYPECOLUMN, " +
"typeof(" + ALT1COLUMN + ") AS TYPE_ALT1COLUMN, " +
"typeof(" + NAMECOLUMN + ") AS TYPE_NAMECOLUMN, " +
"typeof(" + LINKCOLUMN + ") AS TYPE_LINKCOLUMN, " +
"typeof(" + IMAGECOLUMN + ") AS TYPE_IMAGECOLUMN "
},
null,null,null,null,null);
}
Dans activty_main.xml
Je codé une fileuse de base en lui donnant un identifiant de myspinner.
Dans MainActivity
I codé: -
myspinner = (Spinner) findViewById(R.id.myspinner);
dbhlpr.insertAlternativeRow(); //Insert a row with forced types
dbhlpr.insertRow(myspinner.getSelectedItemPosition(),
myspinner.getSelectedItemPosition(),
"FRED","MYLINK",new byte[]{0,7,5,4,3,2,8,10,16,32,64,127});
dbhlpr.insertRow(0,100,"Bert","noweher",new byte[]{100,100,100,100,100});
dbhlpr.insertAlternativeRow();
Cursor csr = dbhlpr.viewRowsWithTypes();
String logdata;
while (csr.moveToNext()) {
Log.d("DBINFO","Row " + csr.getPosition());
logdata = "";
for (int i =0; i < csr.getColumnCount(); i++) {
String val;
try {
val = csr.getString(i);
}
catch (Exception e) {
val = "unobtainable";
}
logdata = logdata + "\t\nColumn Name=" +
csr.getColumnName(i) +
" Value=" + val;
}
Log.d("DBINFO",logdata);
}
csr.close();
Comment faites-vous exactement vérifier le fichier .db? –