2017-08-06 4 views
-1

Je travaille sur une application Android qui utilise un db sqlite pour contenir des informations que l'utilisateur entre. J'ai deux activités. Actuellement, l'activité principale affiche les informations de l'utilisateur à partir de la base de données. la deuxième activité est destinée uniquement à l'entrée de ces données. lorsque la seconde activité est ouverte, je vois les données sauvegardées dans les boîtes d'édition. je peux modifier et enregistrer les données. lors du retour à la première activité, les données affichées ne sont pas mises à jour. si je ferme l'application et la redémarre les nouvelles données seront affichées dans la première activité correctement, mais j'en ai besoin pour montrer immédiatement. J'ai essayé de surcharger onResume() pensant que cela aiderait. mais jusqu'ici cela ne m'a pas aidé. aidez-moi s'il vous plaît à trouver le problème. voici mon activité principale, la première activité:le texte n'est pas mis à jour jusqu'à ce que l'application soit détruite et redémarrée (curseur sqlite)

public class LaunchActivity extends AppCompatActivity{ 

final String SCOPE ="https://www.googleapis.com/auth/gmail.send"; 

private static final int REQUEST_RESOLVE_AUTH_ERROR = 1006; 
private static final int REQUEST_SMS = 645; 
private ImageView mImageView; 
private TextView nameField; 
private TextView phoneField; 
private TextView emailField; 
private ClientInfoDBHelper mInfoDBHelper; 
private Cursor mCursor; 

private String mPhoneNumber = "**********"; 
private String[] permissions = new String[]{Manifest.permission.SEND_SMS, Manifest.permission.READ_PHONE_STATE}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_launch); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    nameField = (TextView) findViewById(R.id.nameView); 
    phoneField = (TextView) findViewById(R.id.phoneView); 
    emailField = (TextView) findViewById(R.id.emailView); 

    mInfoDBHelper = new ClientInfoDBHelper(this); 
    SQLiteDatabase dbReader = mInfoDBHelper.getReadableDatabase(); 
    String[] projection = { 
      ClientInfoContract.ClientInfoEntry.FIRST_NAME, 
      ClientInfoContract.ClientInfoEntry.LAST_NAME, 
      ClientInfoContract.ClientInfoEntry.PHONE_NUMBER, 
      ClientInfoContract.ClientInfoEntry.EMAIL_ADDRESS 
    }; 

    String where = ClientInfoContract.ClientInfoEntry._ID + " = ?"; 
    String[] whereArgs = {"1"}; 
    String sortOrder = ClientInfoContract.ClientInfoEntry.FIRST_NAME + " DESC"; 

    mCursor = dbReader.query(
      ClientInfoContract.ClientInfoEntry.TABLE_NAME, 
      projection, 
      where, 
      whereArgs, 
      null, 
      null, 
      sortOrder 
    ); 
    mCursor.moveToNext(); 
    updateDisplayInfo(mCursor); 

    //request permissions 
    int MyVersion = Build.VERSION.SDK_INT; 
    if (MyVersion> Build.VERSION_CODES.LOLLIPOP_MR1){ 
     if (hasPermission()){ 
      ActivityCompat.requestPermissions(this, permissions, REQUEST_SMS); 
     } 
    } 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Are you certain you'd like to alert your attorney?", Snackbar.LENGTH_INDEFINITE) 
        .setAction(R.string.snack_bar_send, new View.OnClickListener(){ 
         @Override 
         public void onClick(View v){ 
          SmsManager smsManager = SmsManager.getDefault(); 
          smsManager.sendTextMessage(mPhoneNumber, null, "testing", null, null); 
          new MailTask().execute(); 
         } 
        }).show(); 
     } 
    }); 

    mImageView = (ImageView) findViewById(R.id.imageView); 
    mImageView.setImageDrawable(getResources().getDrawable(R.drawable.no_handcuffs)); 

} 

@Override 
public void onResume(){ 
    super.onResume();; 
    updateDisplayInfo(mCursor); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_launch, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    switch (id){ 
     case R.id.action_settings: 
      //null 
      break; 
     case R.id.userInfo: 
      Intent infoIntent = new Intent(this, UserInfoActivity.class); 
      startActivity(infoIntent); 
      break; 
    } 

    return super.onOptionsItemSelected(item); 
} 

private boolean hasPermission(){ 
    int result = ContextCompat.checkSelfPermission(this, permissions[0]); 
    if (result==PackageManager.PERMISSION_DENIED){ 
     return true; 
    }else { 
     return false; 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){ 
    //temporarily null// may be used in future to handle multiple permissions 
} 


public void updateDisplayInfo(Cursor curse){ 
    //curse.moveToNext(); 
    StringBuilder sb = new StringBuilder(); 
    sb.append(curse.getString(curse.getColumnIndex(ClientInfoContract.ClientInfoEntry.FIRST_NAME))) 
      .append(" ") 
      .append(curse.getString(curse.getColumnIndex(ClientInfoContract.ClientInfoEntry.LAST_NAME))); 
    nameField.setText(sb.toString()); 
} 

} 

Répondre

2

Vous venez de retour de votre deuxième activité première activité? Idéalement, onCreate() doit être utilisé uniquement pour initialiser les données ou les attacher aux vues. Si vos données sont en train de changer, vous devez faire les choses donc ajouter onStart() ou onResume()

le code ci-dessous dans votre méthode onStart() et retirer de onCreate().

mInfoDBHelper = new ClientInfoDBHelper(this); 
SQLiteDatabase dbReader = mInfoDBHelper.getReadableDatabase(); 
String[] projection = { 
     ClientInfoContract.ClientInfoEntry.FIRST_NAME, 
     ClientInfoContract.ClientInfoEntry.LAST_NAME, 
     ClientInfoContract.ClientInfoEntry.PHONE_NUMBER, 
     ClientInfoContract.ClientInfoEntry.EMAIL_ADDRESS 
}; 

String where = ClientInfoContract.ClientInfoEntry._ID + " = ?"; 
String[] whereArgs = {"1"}; 
String sortOrder = ClientInfoContract.ClientInfoEntry.FIRST_NAME + " DESC"; 

mCursor = dbReader.query(
     ClientInfoContract.ClientInfoEntry.TABLE_NAME, 
     projection, 
     where, 
     whereArgs, 
     null, 
     null, 
     sortOrder 
); 
mCursor.moveToNext(); 
updateDisplayInfo(mCursor); 

onCreate() n'est appelée qu'une seule fois lors de la création de votre vue. Et puis dans votre onResume() vous essayez d'utiliser le même curseur pour ne pas obtenir les données mises à jour. Vous devrez donc effectuer une nouvelle recherche pour obtenir les données mises à jour.

Ou vous pouvez faire startActivityForResult() et onActivityResult() méthode mettre à jour vos données en tirant une nouvelle requête.

+0

Merci. Cela a fonctionné pour moi. –