Je suis après un code pour obtenir les noms de colonne disponibles d'une table dans Android? P>
J'ai regardé autour de moi et je n'ai rien trouvé. p>
7 Réponses :
try {
Cursor c = db.query(tableName, null, null, null, null, null, null);
if (c != null) {
int num = c.getColumnCount();
for (int i = 0; i < num; ++i) {
String colname = c.getColumnName(i);
}
}
} catch (Exception e) {
Log.v(tableName, e.getMessage(), e);
e.printStackTrace();
}
Ceci est un moyen plus simple:
Cursor ti = db.rawQuery("PRAGMA table_info(mytable)", null);
if ( ti.moveToFirst() ) {
do {
System.out.println("col: " + ti.getString(1));
} while (ti.moveToNext());
}
Qu'en est-il d'obtenir des colonnes de résolution de contenu? Y a-t-il une manière plus simple considérée comme mine, où nous courons la requête sur Cr?
Non, il n'y a pas. Dans ce cas, une projection nulle vous donnera toutes les colonnes.
De la documentation SQLITE "Les déclarations de pragma spécifiques peuvent être supprimées et d'autres ajoutées dans les prochaines versions de SQLite. Il n'y a aucune garantie de compatibilité à l'envers." Très dangereux sur une plate-forme comme Android où la version SQLite n'est pas toujours constante.
La manière la plus simple que j'ai implémentée. Toute meilleure suggestion est la bienvenue. p> p>
@ NJZK2, n'ai pas essayé que lorsque la table est vide. Il suppose que cela fonctionne, seulement que le curseur ne dira aucune ligne
Je l'ai utilisé avec la limite 0, apparemment cela fonctionne, même avec une table vide. J'aime mieux cette solution que d'interroger le pragma.
public class Database_demo extends Activity {
private String jsonResult;
public static final int DIALOG_DOWNLOAD_JSON_PROGRESS = 0;
private String url = "http://192.168.43.2/brother/song.php";
String urll = url;
private ListView listView;
private static final String HTTP_REQUEST_FAILED = null;
int[] flags;
String strImageName;
int n = 10000;
String[] mySecondStringArray = new String[n];
String[] strArray;
private ProgressDialog mProgressDialog;
HashMap<String, String> hm;
List<HashMap<String, String>> aList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView) findViewById(R.id.listview);
try {
accessWebService();
} catch (Exception e) {
Toast.makeText(getApplicationContext(),
"Check ur network connection", 10000).show();
}
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_DOWNLOAD_JSON_PROGRESS:
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("Please wait.....");
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.setCancelable(true);
mProgressDialog.show();
return mProgressDialog;
default:
return null;
}
}
// Async Task to access the web
private class JsonReadTask extends AsyncTask<String, Void, String> {
protected void onPreExecute() {
super.onPreExecute();
showDialog(DIALOG_DOWNLOAD_JSON_PROGRESS);
}
@Override
protected String doInBackground(String... params) {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(params[0]);
try {
HttpResponse response = httpclient.execute(httppost);
jsonResult = inputStreamToString(
response.getEntity().getContent()).toString();
}
catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private StringBuilder inputStreamToString(InputStream is) {
String rLine = "";
StringBuilder answer = new StringBuilder();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
try {
while ((rLine = rd.readLine()) != null) {
answer.append(rLine);
}
}
catch (IOException e) {
// e.printStackTrace();
Toast.makeText(getApplicationContext(),
"Error..." + e.toString(), Toast.LENGTH_LONG).show();
}
return answer;
}
@Override
protected void onPostExecute(String result) {
ListDrwaer();
dismissDialog(DIALOG_DOWNLOAD_JSON_PROGRESS);
}
}
public void accessWebService() {
JsonReadTask task = new JsonReadTask();
// passes values for the urls string array
task.execute(new String[] { url });
}
public void ListDrwaer() {
try {
JSONObject jsonResponse = new JSONObject(jsonResult);
JSONArray jsonMainNode = jsonResponse.optJSONArray("products");
aList = new ArrayList<HashMap<String, String>>();
for (int i = 0; i < jsonMainNode.length(); i++) {
JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
String name = jsonChildNode.optString("field");
hm = new HashMap<String, String>();
hm.put("txt", name);
//hm.put("cur", number);
aList.add(hm);
}
} catch (JSONException e) {
Toast.makeText(getApplicationContext(), "Error" + e.toString(),
Toast.LENGTH_SHORT).show();
}
String[] from = { "flag", "txt" };
int[] to = { R.id.flag, R.id.txt };
SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), aList,
R.layout.news, from, to);
listView.setAdapter(adapter);
}
}
Une alternative à la méthode de ZUL consiste à utiliser columncount avec son exemple simple et une limite de 0.
Cursor cursor = db.rawQuery("SELECT * FROM " + tableName + " LIMIT 0", null);
int colCount = cursor.getColumnNames().length();
private HashMap<String, String[]> getDataBaseMap(SQLiteDatabase db){
HashMap<String, String[]> DBMap = new HashMap<>();
ArrayList<String> tableNames = new ArrayList<>();
String[] columns ;
Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
if (c.moveToFirst()) {
while ( !c.isAfterLast() ) {
tableNames.add(c.getString(0));
c.moveToNext();
}
}
c.close();
for ( int i = 0 ; i < tableNames.size() ; i++){
Cursor cursor = db.rawQuery("select * from " + tableNames.get(i),null);
columns = cursor.getColumnNames();
cursor.moveToNext();
DBMap.put(tableNames.get(i),columns);
cursor.close();
}
return DBMap;
}
Essayez ceci:
meilleur si vous utilisez une STRAND> SQLITEDATABASE STROND> instance et utilisez la méthode de requête p>
SQLiteDatabase mDataBase; (some code here...) mDataBase = getReadableDatabase(); Cursor dbCursor = mDataBase.query(TABLE_NAME, null, null, null, null, null, null); String[] columnNames = dbCursor.getColumnNames();
Que diriez-vous d'essayer d'écrire ... au lieu de la chercher. Le débordement de la pile n'est pas un site de génération de code.