2013-05-17 45 views
0

我有一個存儲ftp站點的登錄信息(名稱,地址,用戶名,密碼,端口,被動)的SQLLite DB。當在列表中點擊一個項目(站點)時,它應該將名稱,地址,用戶名,密碼等加載到相應的EditTexts中。發生的事情是密碼值被加載到地址EditText中,並且地址沒有被加載到任何地方。從SQLLite DB填充的列表項順序不正確

我活動的的addRecord功能如下:

public void addRecord() { 
    long newId = myDb.insertRow(_name, _address, _username, _password, 
      _port, _passive); 
    Cursor cursor = myDb.getRow(newId); 
    displayRecordSet(cursor); 
} 

的參數中的insertRow(順序)對應的順序,我將對DBAdapter,但是當我改變參數的順序,我可以得到的地址和密碼值,最終在正確的EditTexts中,只是從來沒有一次。我究竟做錯了什麼?

public class DBAdapter { 

     // /////////////////////////////////////////////////////////////////// 
     // Constants & Data 
     // /////////////////////////////////////////////////////////////////// 
     // For logging: 
     private static final String TAG = "DBAdapter"; 

     // DB Fields 
     public static final String KEY_ROWID = "_id"; 
     public static final int COL_ROWID = 0; 
     /* 
     * CHANGE 1: 
     */ 
     // TODO: Setup your fields here: 
     public static final String KEY_NAME = "name"; 
     public static final String KEY_ADDRESS = "address"; 
     public static final String KEY_USERNAME = "username"; 
     public static final String KEY_PASSWORD = "password"; 
     public static final String KEY_PORT = "port"; 
     public static final String KEY_PASSIVE = "passive"; 

     // TODO: Setup your field numbers here (0 = KEY_ROWID, 1=...) 
     public static final int COL_NAME = 1; 
     public static final int COL_ADDRESS = 2; 
     public static final int COL_USERNAME = 3; 
     public static final int COL_PASSWORD = 4; 
     public static final int COL_PORT = 5; 
     public static final int COL_PASSIVE = 6; 
     public static final String[] ALL_KEYS = new String[] { KEY_ROWID, KEY_NAME, 
       KEY_ADDRESS, KEY_USERNAME, KEY_PASSWORD, KEY_PORT, KEY_PASSIVE }; 

     // DB info: it's name, and the table we are using (just one). 
     public static final String DATABASE_NAME = "Sites"; 
     public static final String DATABASE_TABLE = "SiteTable"; 
     // Track DB version if a new version of your app changes the format. 
     public static final int DATABASE_VERSION = 2; 

     private static final String DATABASE_CREATE_SQL = "create table " 
       + DATABASE_TABLE 
       + " (" 
       + KEY_ROWID 
       + " integer primary key autoincrement, " 

       /* 
       * CHANGE 2: 
       */ 
       // TODO: Place your fields here! 
       // + KEY_{...} + " {type} not null" 
       // - Key is the column name you created above. 
       // - {type} is one of: text, integer, real, blob 
       // (http://www.sqlite.org/datatype3.html) 
       // - "not null" means it is a required field (must be given a 
       // value). 
       // NOTE: All must be comma separated (end of line!) Last one must 
       // have NO comma!! 
       + KEY_NAME + " string not null, " + KEY_ADDRESS 
       + " string not null, " + KEY_USERNAME + " string not null, " 
       + KEY_PASSWORD + " string not null, " + KEY_PORT 
       + " integer not null," + KEY_PASSIVE + " integer not null" 

       // Rest of creation: 
       + ");"; 

     // Context of application who uses us. 
     private final Context context; 

     private DatabaseHelper myDBHelper; 
     private SQLiteDatabase db; 

     // /////////////////////////////////////////////////////////////////// 
     // Public methods: 
     // /////////////////////////////////////////////////////////////////// 

     public DBAdapter(Context ctx) { 
      this.context = ctx; 
      myDBHelper = new DatabaseHelper(context); 
     } 

     // Open the database connection. 
     public DBAdapter open() { 
      db = myDBHelper.getWritableDatabase(); 
      return this; 
     } 

     // Close the database connection. 
     public void close() { 
      myDBHelper.close(); 
     } 

     // Add a new set of values to the database. 
     public long insertRow(String name, String address, String user, 
       String pass, int port, int passive) { 
      /* 
      * CHANGE 3: 
      */ 
      // TODO: Update data in the row with new fields. 
      // TODO: Also change the function's arguments to be what you need! 
      // Create row's data: 
      ContentValues initialValues = new ContentValues(); 
      initialValues.put(KEY_NAME, name); 
      initialValues.put(KEY_ADDRESS, address); 
      initialValues.put(KEY_USERNAME, user); 
      initialValues.put(KEY_PASSWORD, pass); 
      initialValues.put(KEY_PORT, port); 
      initialValues.put(KEY_PASSIVE, passive); 
      // Insert it into the database. 
      return db.insert(DATABASE_TABLE, null, initialValues); 
     } 

     // Delete a row from the database, by rowId (primary key) 
     public boolean deleteRow(long rowId) { 
      String where = KEY_ROWID + "=" + rowId; 
      return db.delete(DATABASE_TABLE, where, null) != 0; 
     } 

     public void deleteAll() { 
      Cursor c = getAllRows(); 
      long rowId = c.getColumnIndexOrThrow(KEY_ROWID); 
      if (c.moveToFirst()) { 
       do { 
        deleteRow(c.getLong((int) rowId)); 
       } while (c.moveToNext()); 
      } 
      c.close(); 
     } 

     // Return all data in the database. 
     public Cursor getAllRows() { 
      String where = null; 
      Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, where, null, null, 
        null, null, null); 
      if (c != null) { 
       c.moveToFirst(); 
      } 
      return c; 
     } 

     // Get a specific row (by rowId) 
     public Cursor getRow(long rowId) { 
      String where = KEY_ROWID + "=" + rowId; 
      Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, where, null, null, 
        null, null, null); 
      if (c != null) { 
       c.moveToFirst(); 
      } 
      return c; 
     } 

     // Change an existing row to be equal to new data. 
     public boolean updateRow(long rowId, String name, String address, 
       String username, String password, int port, int passive) { 
      String where = KEY_ROWID + "=" + rowId; 

      /* 
      * CHANGE 4: 
      */ 
      // TODO: Update data in the row with new fields. 
      // TODO: Also change the function's arguments to be what you need! 
      // Create row's data: 
      ContentValues newValues = new ContentValues(); 
      newValues.put(KEY_NAME, name); 
      newValues.put(KEY_ADDRESS, address); 
      newValues.put(KEY_USERNAME, username); 
      newValues.put(KEY_PASSWORD, password); 
      newValues.put(KEY_PORT, port); 
      newValues.put(KEY_PASSIVE, passive); 
      // Insert it into the database. 
      return db.update(DATABASE_TABLE, newValues, where, null) != 0; 
     } 

     // /////////////////////////////////////////////////////////////////// 
     // Private Helper Classes: 
     // /////////////////////////////////////////////////////////////////// 

     /** 
     * Private class which handles database creation and upgrading. Used to 
     * handle low-level database access. 
     */ 
     private static class DatabaseHelper extends SQLiteOpenHelper { 
      DatabaseHelper(Context context) { 
       super(context, DATABASE_NAME, null, DATABASE_VERSION); 
      } 

      @Override 
      public void onCreate(SQLiteDatabase _db) { 
       _db.execSQL(DATABASE_CREATE_SQL); 
      } 

      @Override 
      public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) { 
       Log.w(TAG, "Upgrading application's database from version " 
         + oldVersion + " to " + newVersion 
         + ", which will destroy all old data!"); 

       // Destroy old database: 
       _db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 

       // Recreate new database: 
       onCreate(_db); 
      } 
     } 
    } 

public class SiteManager extends Activity { 
    DBAdapter myDb; 
    public FTPClient mFTPClient = null; 

    public EditText etSitename; 
    public EditText etAddress; 
    public EditText etUsername; 
    public EditText etPassword; 
    public EditText etPort; 
    public CheckBox cbPassive; 
    public ListView site_list; 

    public Button clr; 
    public Button test; 
    public Button savesite; 
    public Button close; 
    public Button connect; 

    String _name; 
    String _address; 
    String _username; 
    String _password; 
    int _port; 
    int _passive = 0; 

    List<FTPSite> model = new ArrayList<FTPSite>(); 
    ArrayAdapter<FTPSite> adapter; 

    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.site_manager); 

     site_list = (ListView) findViewById(R.id.siteList); 

     adapter = new SiteAdapter(this, R.id.ftpsitename, R.layout.siterow, 
       model); 
     site_list.setAdapter(adapter); 
     etSitename = (EditText) findViewById(R.id.dialogsitename); 
     etAddress = (EditText) findViewById(R.id.dialogaddress); 
     etUsername = (EditText) findViewById(R.id.dialogusername); 
     etPassword = (EditText) findViewById(R.id.dialogpassword); 
     etPort = (EditText) findViewById(R.id.dialogport); 
     cbPassive = (CheckBox) findViewById(R.id.dialogpassive); 
     close = (Button) findViewById(R.id.closeBtn); 

     connect = (Button) findViewById(R.id.connectBtn); 
     clr = (Button) findViewById(R.id.clrBtn); 
     test = (Button) findViewById(R.id.testBtn); 

     savesite = (Button) findViewById(R.id.saveSite); 
     addListeners(); 
     openDb(); 
     displayRecords(); 
    } 

    public void addListeners() { 

     connect.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent returnResult = new Intent(); 
       returnResult.putExtra("ftpname", _name); 
       returnResult.putExtra("ftpaddress", _address); 
       returnResult.putExtra("ftpusername", _username); 
       returnResult.putExtra("ftppassword", _password); 
       returnResult.putExtra("ftpport", _port); 
       setResult(RESULT_OK, returnResult); 
       finish(); 

      } 
     }); 

     test.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       _name = etSitename.getText().toString(); 
       _address = etAddress.getText().toString(); 
       _username = etUsername.getText().toString(); 
       _password = etPassword.getText().toString(); 
       _port = Integer.parseInt(etPort.getText().toString()); 

       if (cbPassive.isChecked()) { 
        _passive = 1; 
       } else { 
        _passive = 0; 
       } 

       boolean status = ftpConnect(_address, _username, _password, 
         _port); 
       ftpDisconnect(); 

       if (status == true) { 
        Toast.makeText(SiteManager.this, "Connection Succesful", 
          Toast.LENGTH_LONG).show(); 
        savesite.setVisibility(0); 
       } else { 
        Toast.makeText(SiteManager.this, 
          "Connection Failed:" + status, Toast.LENGTH_LONG) 
          .show(); 

       } 
      } 
     }); 

     savesite.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       _name = etSitename.getText().toString(); 
       _address = etAddress.getText().toString(); 
       _username = etUsername.getText().toString(); 
       _password = etPassword.getText().toString(); 
       _port = Integer.parseInt(etPort.getText().toString()); 
       if (cbPassive.isChecked()) { 
        _passive = 1; 
       } else { 
        _passive = 0; 
       } 
       addRecord(); 
       adapter.notifyDataSetChanged(); 
      } 
     }); 

     close.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       finish(); 
      } 
     }); 

     clr.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       clearAll(); 
      } 
     }); 

     site_list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, final View view, 
        int position, long id) { 
       final FTPSite item = (FTPSite) parent 
         .getItemAtPosition(position); 
       String tmpname = item.getName(); 
       String tmpaddress = item.getAddress(); 
       String tmpuser = item.getUsername(); 
       String tmppass = item.getPassword(); 
       int tmpport = item.getPort(); 
       String tmp_port = Integer.toString(tmpport); 
       int tmppassive = item.isPassive(); 

       etSitename.setText(tmpname); 
       etAddress.setText(tmpaddress); 
       etUsername.setText(tmpuser); 
       etPassword.setText(tmppass); 
       etPort.setText(tmp_port); 
       if (tmppassive == 1) { 
        cbPassive.setChecked(true); 
       } else { 
        cbPassive.setChecked(false); 
       } 
      } 

     }); 

    } 

    public void addRecord() { 
     long newId = myDb.insertRow(_name, _username, _address,_password, 
       _port, _passive); 
     Cursor cursor = myDb.getRow(newId); 
     displayRecordSet(cursor); 
    } 

    private void openDb() { 
     myDb = new DBAdapter(this); 
     myDb.open(); 
    } 

    @Override 
    protected void onDestroy() { 
     // TODO Auto-generated method stub 
     super.onDestroy(); 
     closeDb(); 
    } 

    private void closeDb() { 
     myDb.close(); 
    } 

    public void displayRecords() { 

     Cursor cursor = myDb.getAllRows(); 
     displayRecordSet(cursor); 
    } 

    protected void displayRecordSet(Cursor c) { 
     // String msg = ""; 

     if (c.moveToFirst()) { 
      do { 
       // int id = c.getInt(0); 
       _name = c.getString(1); 
       _address = c.getString(2); 
       _username = c.getString(3); 
       _password = c.getString(4); 
       _port = c.getInt(5); 

       FTPSite sitesFromDB = new FTPSite(); 
       sitesFromDB.setName(_name); 
       sitesFromDB.setAddress(_address); 
       sitesFromDB.setUsername(_username); 
       sitesFromDB.setAddress(_password); 
       sitesFromDB.setPort(_port); 
       sitesFromDB.setPassive(_passive); 
       model.add(sitesFromDB); 
       adapter.notifyDataSetChanged(); 
      } while (c.moveToNext()); 
     } 
     c.close(); 
    } 

    public void clearAll() { 
     myDb.deleteAll(); 
     adapter.notifyDataSetChanged(); 
    } 

    public boolean ftpConnect(String host, String username, String password, 
      int port) { 
     try { 
      mFTPClient = new FTPClient(); 
      // connecting to the host 
      mFTPClient.connect(host, port); 

      // now check the reply code, if positive mean connection success 
      if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())) { 
       // login using username & password 
       boolean status = mFTPClient.login(username, password); 

       mFTPClient.enterLocalPassiveMode(); 
       return status; 
      } 
     } catch (Exception e) { 
      // Log.d(TAG, "Error: could not connect to host " + host); 
     } 

     return false; 
    } 

    public boolean ftpDisconnect() { 
     try { 
      mFTPClient.logout(); 
      mFTPClient.disconnect(); 
      return true; 
     } catch (Exception e) { 
      // Log.d(TAG, 
      // "Error occurred while disconnecting from ftp server."); 
     } 

     return false; 
    } 

    class SiteAdapter extends ArrayAdapter<FTPSite> { 
     private final List<FTPSite> objects; 
     private final Context context; 

     public SiteAdapter(Context context, int resource, 
       int textViewResourceId, List<FTPSite> objects) { 
      super(context, R.id.ftpsitename, R.layout.siterow, objects); 
      this.context = context; 
      this.objects = objects; 
     } 

     /** @return The number of items in the */ 
     public int getCount() { 
      return objects.size(); 
     } 

     public boolean areAllItemsSelectable() { 
      return false; 
     } 

     /** Use the array index as a unique id. */ 
     public long getItemId(int position) { 
      return position; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      View rowView = inflater.inflate(R.layout.siterow, parent, false); 
      TextView textView = (TextView) rowView 
        .findViewById(R.id.ftpsitename); 

      textView.setText(objects.get(position).getName()); 

      return (rowView); 
     } 
    } 

回答

0

這是令人尷尬的。我有sitesFromDB.setAddress(_password);,而不是sitesFromDB.setPassword(_password);

1

我想你應該嘗試使用:

 int keyNameIndex = c.getColumnIndex(DBAdapter.KEY_NAME); 
     _name = c.getString(keyNameIndex); 

而不是使用直接number.I的我不知道它會導致錯誤,但它會是更好的鍛鍊。希望它是幫助。

+0

沒有解決我的問題,但+1這種新的生活方式 – RapsFan1981

1

有一個在你的參數不匹配見下文

public long insertRow(String name, String address, String user, 
      String pass, int port, int passive) { 


public void addRecord() { 
    long newId = myDb.insertRow(_name, _username, _address,_password, 
      _port, _passive); 
    Cursor cursor = myDb.getRow(newId); 
    displayRecordSet(cursor); 
} 

要傳遞的用戶名,以解決和處理用戶

+0

並檢查您的文本框中的名稱是否已經給出了正確的ID爲右側文本框中 – prvn

+0

這是一個的addRecord故意改變()(看我編輯與我原來的)當我將其更改爲長newId = myDb.insertRow(_name,_username,_address,_password, _port,_passive);除_password字段外,所有EditText都正確填充。 – RapsFan1981