How do I delete a record from my random access file?
Asked Answered
T

2

0

I was wondering how I could delete a record from my random access file.

Here's how I add to my RAF, not sure how to delete it though :X

public void addNewStudent(String name, String formClass, String emailAddress, String country1, String country2, String universityChoice)
{
    try
    {
        RandomAccessFile theFile = new RandomAccessFile("studentData.dat","rw");
        long records = (theFile.length()+299)/300; //Number of records
        if(theFile.length()>0) //Check if the file is empty or not
        {
            for(long x=0;x<records;x++)
            {
                theFile.seek(x*300);
                String currentName = theFile.readUTF();
                if(name.equalsIgnoreCase(currentName)) //Check if student exists in database
                {
                    output("This student exist already"); //Output this if exists
                }
                else // or else write a new record
                {
                    theFile.seek(records*300);
                    theFile.writeUTF(name); //Write student name
                    theFile.seek((records*300)+50);
                    theFile.writeUTF(formClass); //Writes students' form class
                    theFile.seek((records*300)+60);
                    theFile.writeUTF(emailAddress); //Writes students' email
                    theFile.seek((records*300)+100);
                    theFile.writeUTF(country1); //Writes students' country choice #1
                    theFile.seek((records*300)+140);
                    theFile.writeUTF(country2); //Writes students' country choice #2
                    theFile.seek((records*300)+180);
                    theFile.writeUTF(universityChoice); //Writes students' university choices
                    students.add(name,formClass,emailAddress,country1,country2,universityChoice);
                }
            }
        }
        else //If the file isn't empty, then just write
        {
            theFile.seek(records*300);
            theFile.writeUTF(name); //Write student name
            theFile.seek((records*300)+50);
            theFile.writeUTF(formClass); //Writes students' form class
            theFile.seek((records*300)+60);
            theFile.writeUTF(emailAddress); //Writes students' email
            theFile.seek((records*300)+100);
            theFile.writeUTF(country1); //Writes students' country choice #1
            theFile.seek((records*300)+140);
            theFile.writeUTF(country2); //Writes students' country choice #2
            theFile.seek((records*300)+180);
            theFile.writeUTF(universityChoice); //Writes students' university choices
            students.add(name,formClass,emailAddress,country1,country2,universityChoice);          
        }
    }

    catch(IOException e)
    {
        output("Error while adding new student");
    }
}
Thaumaturge answered 13/3, 2011 at 18:21 Comment(3)
Why not just use a database? If you need your data to be in a single portable file, you can use sqlite.Indra
It's for a school project, so I have to be within the criteria :(Thaumaturge
were you looking for this question to be deleted? Can you explain your recent edit?Catabasis
M
2

I would have a deleted flag and if its set, don't read it in.

Marilee answered 13/3, 2011 at 18:26 Comment(3)
Set the first field to an "illegal" value, like "[[deleted]]" which is unlikely to be anyone's name.Barracks
Or even add a boolean flag called deleted and set that to true or false.Marilee
How hard would it be to seek the position, and shift everything up?Thaumaturge
T
0

Best way: create a delete dialog method. Have that method write a blank record to the file. Creating a blank record is easy if your constructor(s) are set up correctly.

When the blank record is written as a series of zeroes and nulls, and if your program is set to only show records with proper values, it won't show any records with 0/null values.

Trujillo answered 13/1, 2014 at 2:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.