2016-06-03 8 views
0

Ich habe versucht, viele verschiedene Codes, dies zu tun, aber nichts scheint zu funktionieren. .Benutzerinformationen in einer Datei speichern und diese Informationen zurück erhalten

Im Versuch, eine einfache App zu machen, die Benutzer registrieren können und die Informationen speichern und verwenden Sie es in loggt Ich habe eine Klasse mit dem Namen schreiben in Datei:

public class WriteToFile { 

Vector<Account> massAccount = new Vector<>(); 

public File openFile(File path, String fileName) throws IOException { 
    File f = new File(path, fileName); 
    f.createNewFile(); 
    return f; 
} 

public String getFileData(File f) { 
    String res = ""; 
    res = f.getAbsolutePath() + "\n"; 
    res += f.length() + "\n"; 
    res += new java.util.Date(f.lastModified()); 
    return res; 
} 

public void writeToFile(File f, String data) throws IOException { 
    FileWriter fw = new FileWriter(f); 
    fw.write(data); 
    fw.close(); 
} 

public String readFromFile(File f) throws IOException { 
    FileReader fr = new FileReader(f); 
    int size = (int)f.length(); 
    char[] res = new char[size]; 
    fr.read(res); 
    return new String(res); 
} 

public void writeObject(File f, String user, String pass, String question, String answer, Vector<Account> mass) throws IOException { 
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f)); 
    Account acc; 
    acc = new Account(user, pass,question, answer); 
    out.writeObject(acc); 
    for (Account accou: mass){ 
     out.writeObject(accou); 
    } 

    out.close(); 
} 

public Object readObject(File f, String accName) throws IOException 
{ 
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(f)); 
    Account acc; 
    String res = ""; 
    try { 
     while(true) 
     { 
      acc = (Account) in.readObject(); 
      if(acc.getUsername().equals(accName)) 
      return acc; 
     } 
    } 
    catch(EOFException e) 
    { 
     res = res + "End Of Records"; 
    } 
    catch(ClassNotFoundException e){} 
    return res; 
} 

public Vector<Account> readAllObjects(File f) throws IOException{ 
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(f)); 
    Account acc; 
    String res = ""; 
    try{ 
     while(true){ 
      acc = (Account) in.readObject(); 
      massAccount.add(acc); 
     } 
    } 
    catch (EOFException e){ 
     res = res + "End of Records"; 
    } 
    catch (ClassNotFoundException e){ 

    } 
    return massAccount; 
} 
} 

Und von dem, was ich verstanden verwenden Dateien sollte es in Ordnung sein, aber es scheint nicht zu funktionieren.

Zum Beispiel, wenn ich versuche, eine neue Datei zu machen und daraus zu lesen hier:

public class RegisterActivity extends AppCompatActivity { 
private EditText user, pass, hint, hintans, confirm; 
private Button Regi; 
private String saveUser = "", savePass = "", saveHint = "", checkUser = "" , checkPass = "", saveAns = "", confirmpass = ""; 
private WriteToFile writeToFile; 
private File f; 
private Account AccInfo; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_register); 
    user = (EditText)findViewById(R.id.regUser); 
    pass = (EditText)findViewById(R.id.regPass); 
    Regi = (Button)findViewById(R.id.btncon); 
    hint = (EditText)findViewById(R.id.regHint); 
    hintans = (EditText)findViewById(R.id.hintAnswer); 
    confirm = (EditText)findViewById(R.id.btnConPass); 
    writeToFile = new WriteToFile(); 
    Regi.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      try { 
       File dir = getFilesDir(); 
       f = writeToFile.openFile(dir, "User.txt"); 
       saveUser = user.getText().toString(); 
       savePass = pass.getText().toString(); 
       saveHint = hint.getText().toString(); 
       saveAns = hintans.getText().toString(); 
       confirmpass = confirm.getText().toString(); 
       AccInfo = (Account)writeToFile.readObject(f,saveUser); 
       if(AccInfo.getUsername().equals(saveUser)) 
        Toasty("Username already Exists."); 
       if(savePass.equals("")) 
        Toasty("Cannot leave password line empty."); 
       else if(!savePass.equals(confirmpass)){ 
        Toasty("Passwords don't match!"); 
       } 
       else{ 
        writeToFile.readAllObjects(f); 
        writeToFile.writeObject(f, saveUser, savePass, saveHint, saveAns, writeToFile.readAllObjects(f)); 
        Toasty("You have successfully registered!"); 
        Intent i = new Intent(RegisterActivity.this, LoginActivity.class); 
        startActivity(i); 
       } 
      } 
      catch (IOException e){ 
       Log.d("Error", "Regi onclick"); 
      } 
     } 
    }); 
} 

private void Toasty(String word){ 
    Toast.makeText(RegisterActivity.this, word, Toast.LENGTH_SHORT).show(); 
} 

} 

ich immer eine IOException erhalten, so im Erraten ok mein Code ist aber im etwas falsch mit der Verwendung von Dateien zu tun.

Jede Hilfe wird sehr geschätzt.

Dank

EDIT: ich es geschafft, vielleicht das Problem zu verengen. Wenn ich diese Methode aufrufen;

AccInfo = (Account)writeToFile.readObject(f,saveUser); 

ich:

Regi onclick: null 
java.io.EOFException 
at libcore.io.Streams.readFully(Streams.java:83) 
at java.io.DataInputStream.readShort(DataInputStream.java:152) 
     atjava.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2061) 
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:371) 
at merccorp.worklist.WriteToFile.readObject(WriteToFile.java:69) 
at merccorp.worklist.RegisterActivity$1.onClick(RegisterActivity.java:55) 
at android.view.View.performClick(View.java:5198) 
at android.view.View$PerformClick.run(View.java:21147) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

was dazu führt:

public Object readObject(File f, String accName) throws IOException { 
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(f)); 
    Account acc; 
    String res = ""; 
    try { 
     while(true) { 
      acc = (Account) in.readObject(); 
      if(acc.getUsername().equals(accName)) 
       return acc; 
     } 
    } 
    catch(EOFException e) { 
     return acc = new Account("Default","secretPass","",""); 
    } 
    catch(ClassNotFoundException e){} 
    return acc = new Account("Default","secretPass","",""); 
} 

Und es zeigt auf die erste Zeile:

ObjectInputStream in = new ObjectInputStream(new FileInputStream(f)); 

Ich habe keine Ahnung, was im tut falsch. Und es tut mir leid für die Menge an Code, aber ich bin extrem verwirrt, was das verursacht.

Danke nochmal!

+0

Könnten Sie den Stack-Trace schreiben, wo Sie die IOException bekommen? – JonasCz

+0

Und in getFileData Methode, sollten Sie StringBuilder zum Beispiel verwenden ... Wenn Sie Contrating auf Srings aufrufen, erstellen jedes concat ein neues String-Objekt und ein anderes für Ergebnis (plus eins für alten Wert) .... Versuchen Sie StringBuilder zu verwenden, Anhängen Strings und schließlich nur ToString() bei der Rückkehr aufrufen. – Hrabosch

+0

Wo Sie die IOException statt Log.d fangen ("Error", "Regi onclick"); versuche Log.d ("Fehler", e.getMessage()); Auf diese Weise werden Sie sehen, was falsch ist. –

Antwort

0

Sie können SQLite zum Speichern von Benutzerinformationen verwenden. Das ist wieder leicht zugänglich.

DataBaseHelper.java

package com.techblogon.loginexample; 

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DataBaseHelper extends SQLiteOpenHelper 
{ 
    public DataBaseHelper(Context context, String name,CursorFactory factory, int version) 
    { 
       super(context, name, factory, version); 
    } 
    // Called when no database exists in disk and the helper class needs 
    // to create a new one. 
    @Override 
    public void onCreate(SQLiteDatabase _db) 
    { 
      _db.execSQL(LoginDataBaseAdapter.DATABASE_CREATE); 

    } 
    // Called when there is a database version mismatch meaning that the version 
    // of the database on disk needs to be upgraded to the current version. 
    @Override 
    public void onUpgrade(SQLiteDatabase _db, int _oldVersion, int _newVersion) 
    { 
      // Log the version upgrade. 
      Log.w("TaskDBAdapter", "Upgrading from version " +_oldVersion + " to " +_newVersion + ", which will destroy all old data"); 

      // Upgrade the existing database to conform to the new version. Multiple 
      // previous versions can be handled by comparing _oldVersion and _newVersion 
      // values. 
      // The simplest case is to drop the old table and create a new one. 
      _db.execSQL("DROP TABLE IF EXISTS " + "TEMPLATE"); 
      // Create a new one. 
      onCreate(_db); 
    } 

} 

LoginDataBaseAdapter.java

package com.techblogon.loginexample; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 

public class LoginDataBaseAdapter 
{ 
     static final String DATABASE_NAME = "login.db"; 
     static final int DATABASE_VERSION = 1; 
     public static final int NAME_COLUMN = 1; 
     // TODO: Create public field for each column in your table. 
     // SQL Statement to create a new database. 
     static final String DATABASE_CREATE = "create table "+"LOGIN"+ 
            "(" +"ID"+" integer primary key autoincrement,"+ "USERNAME text,PASSWORD text); "; 
     // Variable to hold the database instance 
     public SQLiteDatabase db; 
     // Context of the application using the database. 
     private final Context context; 
     // Database open/upgrade helper 
     private DataBaseHelper dbHelper; 
     public LoginDataBaseAdapter(Context _context) 
     { 
      context = _context; 
      dbHelper = new DataBaseHelper(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 
     public LoginDataBaseAdapter open() throws SQLException 
     { 
      db = dbHelper.getWritableDatabase(); 
      return this; 
     } 
     public void close() 
     { 
      db.close(); 
     } 

     public SQLiteDatabase getDatabaseInstance() 
     { 
      return db; 
     } 

     public void insertEntry(String userName,String password) 
     { 
      ContentValues newValues = new ContentValues(); 
      // Assign values for each row. 
      newValues.put("USERNAME", userName); 
      newValues.put("PASSWORD",password); 

      // Insert the row into your table 
      db.insert("LOGIN", null, newValues); 
      ///Toast.makeText(context, "Reminder Is Successfully Saved", Toast.LENGTH_LONG).show(); 
     } 
     public int deleteEntry(String UserName) 
     { 
      //String id=String.valueOf(ID); 
      String where="USERNAME=?"; 
      int numberOFEntriesDeleted= db.delete("LOGIN", where, new String[]{UserName}) ; 
      // Toast.makeText(context, "Number fo Entry Deleted Successfully : "+numberOFEntriesDeleted, Toast.LENGTH_LONG).show(); 
      return numberOFEntriesDeleted; 
     } 
     public String getSinlgeEntry(String userName) 
     { 
      Cursor cursor=db.query("LOGIN", null, " USERNAME=?", new String[]{userName}, null, null, null); 
      if(cursor.getCount()<1) // UserName Not Exist 
      { 
       cursor.close(); 
       return "NOT EXIST"; 
      } 
      cursor.moveToFirst(); 
      String password= cursor.getString(cursor.getColumnIndex("PASSWORD")); 
      cursor.close(); 
      return password;     
     } 
     public void updateEntry(String userName,String password) 
     { 
      // Define the updated row content. 
      ContentValues updatedValues = new ContentValues(); 
      // Assign values for each row. 
      updatedValues.put("USERNAME", userName); 
      updatedValues.put("PASSWORD",password); 

      String where="USERNAME = ?"; 
      db.update("LOGIN",updatedValues, where, new String[]{userName});    
     }  
} 

Für Anmelden

// get Instance of Database Adapter 
LoginDataBaseAdapter loginDataBaseAdapter=new LoginDataBaseAdapter(this); 
loginDataBaseAdapter=loginDataBaseAdapter.open(); 


// Save the Data in Database 
loginDataBaseAdapter.insertEntry(userName, password); 

für die Anmeldung

// fetch the Password form database for respective user name 
String storedPassword=loginDataBaseAdapter.getSinlgeEntry(userName); 

// check if the Stored password matches with Password entered by user 
if(password.equals(storedPassword)) 
{ 
    //..... 
} 
else 
{ 
    //... 
} 
0

sollten Sie nicht Ihre eigene openFile(...) - Methode schreiben (vielleicht haben Sie die android persisntance article falsch interpretiert). Verwenden Sie stattdessen die vordefinierte Methode von Context. Ihre Aktivität ist von Context abgeleitet, Sie können sie also direkt verwenden.

Context con = MyActivity.this; //Activity is subclass of Context 

//reading file content 
FileInputStream fis = con.openFileInput("myfilename.bin"); 

//writing file content 
int mode = Context.MODE_PRIVATE; // or Context.MODE_APPEND, see Context API 
FileOutputStream fos = con.openFileOutput("myfilename.bin", mode); 

//or 
//alternate solution 
File currentDir = con.getFilesDir(); 
File newFile = new File(currentDir, "myfilename.bin"); 

Code könnte so einfach adjustet werden, in denen wir suchen sehen bereits

... 
Regi.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     try { 
      //File dir = getFilesDir(); not this way! 
      File dir = RegisterActivity.this.getFilesDir(); //but this way 
      //doing it this way you use the Context in a proper way 
      ... 
     }... 
    } 
} 
Verwandte Themen