2013-04-23 114 views
-1

我是新来的android的数据库的东西。我想知道如何从我的数据库中得到一个例如NAME的行ID。我已经使用了下面的一些研究,现在我坚持在显示部分。显示来自mysqllite数据库的数据android

 public class DestinateurTable { 

       public String TABLE_NAME="destinateur"; 

       public String ROW_ID="rowid"; 
       public String NAME="name"; 
       public String AGENCE="agence"; 
       public String EMAIL="email"; 



      } 


     public class Destinataire { 


      public String rowid,name,agence,email; 


     } 


    **My DBHelper.class** 


    public class DBHelper { 

    private final String DATABASE_PATH = "/data/data/.../databases/"; 
    private final String DATABASE_NAME = "...sqlite"; 
    private final static int DATABASE_VERSION = 1; 

    private Context context; 
    private SQLiteDatabase database = null; 
    OpenHelper openHelper=null; 
    StringBuilder query =null; 
    Cursor cursor=null; 

    DestinateurTable destinataireTable = new DestinateurTable(); 

    public static DBHelper dbHelper = null; 

    private DBHelper(Context context) { 

    this.context = context; 
    openHelper = new OpenHelper(this.context); 
    this.database = openHelper.getWritableDatabase(); 

    try { 

     createDataBase(); 
     openDataBase(); 

    } catch (IOException e) { 

     e.printStackTrace(); 
    } 

    } 
    public static DBHelper getInstance(Context context) 
    { 
    if(dbHelper == null) 
     dbHelper = new DBHelper(context); 
    return dbHelper; 
    } 

    public void openDataBase() throws SQLException{ 

    //Open the database 
    String myPath = DATABASE_PATH + DATABASE_NAME; 
    database = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
    } 

    /** 
    * Creates a empty database on the system and rewrites it with your own database. 
    * */ 
    public void createDataBase() throws IOException 
    { 
    openHelper.getReadableDatabase(); 
    if(getDBAlreadyCopiedToDeviceOnceFlag(context) == false){ 
     try { 
     copyDataBase(); 
     setDBAlreadyCopiedToDeviceOnceFlag(context); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     throw new Error("Error copying database"); 
     } 
    } 
    } 

    /** 
    * Check if the database already exist to avoid re-copying the file each time you open the application. 
    * @return true if it exists, false if it doesn't 
    */ 
    @SuppressWarnings("unused") 
    private boolean checkDataBase(){ 

    SQLiteDatabase checkDB = null; 

    try{ 
     String myPath = DATABASE_PATH + DATABASE_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 

    }catch(SQLiteException e){ 

     //database does't exist yet. 

    } 

    if(checkDB != null){ 

     checkDB.close(); 

    } 

    return checkDB != null ? true : false; 
    } 

    /** 
    * Copies your database from your local assets-folder to the just created empty database in the 
    * system folder, from where it can be accessed and handled. 
    * This is done by transfering bytestream. 
    * */ 
    private void copyDataBase() throws IOException{ 

    //Open your local db as the input stream 
    InputStream myInput = context.getAssets().open(DATABASE_NAME); 

    // Path to the just created empty db 
    String outFileName = DATABASE_PATH + DATABASE_NAME; 

    //Open the empty db as the output stream 
    OutputStream myOutput = new FileOutputStream(outFileName); 

    //transfer bytes from the inputfile to the outputfile 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer))>0){ 
     myOutput.write(buffer, 0, length); 
    } 

    //Close the streams 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 

    } 

    private class OpenHelper extends SQLiteOpenHelper 
    { 

     @SuppressWarnings("unused") 
     SQLiteStatement insertStmt; 

     public OpenHelper(Context context) 
     { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) 
     { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
     { 
      // TODO Auto-generated method stub 
     } 
    } 


    public void setDBAlreadyCopiedToDeviceOnceFlag(Context ctx) 
    { 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); 
     SharedPreferences.Editor editor = prefs.edit(); 
     editor.putBoolean("isDBAlreadyCopiedToDeviceOnce", true); 
     editor.commit(); 
    } 

    public boolean getDBAlreadyCopiedToDeviceOnceFlag(Context ctx) 
    { 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); 
     boolean isDBAlreadyCopiedToDeviceOnce = prefs.getBoolean("isDBAlreadyCopiedToDeviceOnce", false); 
     return isDBAlreadyCopiedToDeviceOnce; 
    } 



    //////////////////////////// 
    //// Write your methods here 
    //////////////////////////// 

    public ArrayList<Destinataire> getDestinataireList() 
    { 
     ArrayList<Destinataire> items=new ArrayList<Destinataire>(); 

     try 
     { 
      query = new StringBuilder(); 
      query.append("select * from "+destinataireTable.TABLE_NAME); 

      cursor=this.database.rawQuery(query.toString(),null); 
      if (cursor.moveToFirst()) 
      { 
       do 
       { 
        Destinataire d=new Destinataire(); 

        d.rowid=cursor.getString(cursor.getColumnIndex(destinataireTable.ROW_ID)); 
        d.name=cursor.getString(cursor.getColumnIndex(destinataireTable.NAME)); 
        d.agence=cursor.getString(cursor.getColumnIndex(destinataireTable.AGENCE)); 
        d.email=cursor.getString(cursor.getColumnIndex(destinataireTable.EMAIL)); 

        items.add(d); 

       } 

       while (cursor.moveToNext()); 
      } 
      if (cursor != null && !cursor.isClosed()) 
      { 
      cursor.close(); 

      } 
     } 
     catch(SQLiteException e){ 

      e.printStackTrace(); 
      return null; 
     } 

     return items; 
    } 

    //--here 
    public boolean addDestinataire(Destinataire d){ 
     this.database.beginTransaction(); 

     try{ 

      ContentValues contentValues=new ContentValues(); 

      contentValues.put(destinataireTable.ROW_ID, d.rowid); 
      contentValues.put(destinataireTable.NAME, d.name); 
      contentValues.put(destinataireTable.AGENCE, d.agence); 
      contentValues.put(destinataireTable.EMAIL, d.email); 

      this.database.insert(destinataireTable.TABLE_NAME,null,contentValues); 

      this.database.setTransactionSuccessful(); 

     } catch(Exception e){ 

      e.printStackTrace(); 

      return false; 

     } finally{ 

      this.database.endTransaction(); 

     } 

     return true; 
    } 


    public boolean deleteDestinataire(String id){ 

     try { 

      String query="delete from " + destinataireTable.TABLE_NAME+" where "+destinataireTable.ROW_ID+"='"+id+"'"; 
      this.database.execSQL(query); 
     } 

     catch(SQLiteException e){ 
      e.printStackTrace(); 
      return false; 
     } 
     return true; 
    } 


} 
+0

Salut! Cool de croiser desfrançaispar ici =)Je te conseil de lire ce tuto du site duzérosur la base dedonénesSQLite en Android:http://www.siteduzero.com/informatique/tutoriels/creez-des-applications-pour -android/les-bases-de-donnees – ZarkDev 2013-04-23 08:18:21

+0

j'ai beinin d'une solution au plus vite – Christina 2013-04-23 08:28:48

+0

Faut poster plus de code si tu veux de l'aide。 Ta提问est floue。 – 2013-04-23 08:30:17

回答

0

您的整个数据库操作似乎很好。你提到现在你想显示数据。 做它使用的是ListView,其连接到Adapter的最常见的方式,你可以直接用光标使用适配器,但你已经得到了它作为一个清单,这样你就可以使用ArrayAdapter

要使用它作为一个简单的测试,并开始了解它是如何工作的。创建extends ListActivity,然后你写下面的代码就可以了新的活动:

public class MyListActivity extends ListActivity{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ArrayList<Destinataire> items = getDestinataireList(); 
     ArrayAdapter<Destinataire> adapter = new ArrayAdapter<Destinataire>(this, android.R.layout.simple_list_item_1 , android.R.id.text1, items) 
     setListAdapter(adapter); 
    } 
} 

还包括该行的Destinataire类中:

@Override 
public String toString() { 
    return name + " " + agence + " " + email; 
} 

这是一个非常简单的例子,它不是最优化(对例如,您应该使用后台线程从数据库加载数据),但它应该显示一个列表,其中每个项目显示name agence email

快乐编码!

编辑:

这一行:

new ArrayAdapter<Destinataire>(this, android.R.layout.simple_list_item_1 , android.R.id.text1, items) 

...有一些重要的部分,所以让我解释一下:

  • ArrayAdapter:它是标准的行为是调用toString( )对于Array中的对象,在完成第一部分之后,您可以开始学习CustomAdapter,以制作更复杂(有趣)的内容。
  • this:这是引用ListActivity。每个活动都扩展了一个ContextWrapper,这意味着它们持有对设备资源的引用。适配器创建布局非常重要。
  • android.R.layout.simple_list_item_1:这是一个标准的Android布局,只是一行文本。非常简单,但对于快速测试非常有用。它告诉适配器为每个项目使用此布局。
  • android.R.id.text1:它是布局中文本的ID。它告诉适配器在布局中有一个带有该ID的TextView。所以它会从数据对象中获取toString(),并将其设置为TextView
  • items:这就是你的数据。
+0

是的,但如果我想只检索名称,例如意味着数据库中的一行 – Christina 2013-04-23 09:01:48

+0

ArrayAdapter将在您的Destinataire类上调用toString()。所以你可以把toString改成你需要的任何东西。现在我将编辑我的答案,并对适配器进行更多解释。请阅读。 – Budius 2013-04-23 09:04:26

+0

我得到一个空指针exeption ..我相信我的数据库路径是错误的..是正确的方式采取“/ data/data/package_name/databases /作为DATABASE_PATH? – Christina 2013-04-23 09:24:38