8
votes

Comment obtenir une arrayliste de colonnes de tables sur Android?

Je suis après un code pour obtenir les noms de colonne disponibles d'une table dans Android?

J'ai regardé autour de moi et je n'ai rien trouvé.


1 commentaires

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.


7 Réponses :


2
votes
    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();
    }

0 commentaires

21
votes

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


3 commentaires

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.



14
votes

La manière la plus simple que j'ai implémentée. XXX

Toute meilleure suggestion est la bienvenue.


2 commentaires

@ 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.



2
votes
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);


}
}

0 commentaires

1
votes

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();


0 commentaires

0
votes

Carte de la base de données
 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;
}


0 commentaires

0
votes

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();


0 commentaires