2013-11-20 2 views
0

그래서 파일 기반 데이터베이스와 인터페이스하기위한 프로그램을 만들고 있습니다. 대부분 나는 객체를 만들고 데이터베이스에 정보를 저장하여 나중에 데이터를 가져올 수 있도록 작업하는 방법을 알아 내려고 노력하고 있습니다.데이터베이스에 객체 저장하기 Java

IE Object Taylor 
Name = Taylor 
Age = 20 
School = Whatever 

그래서 다시 질문을 받으면 해당 정보를 불러올 수 있습니다.

다음은 저장하려는 개체의 예입니다. 나는이 부분을 잘못하고 있을지도 모른다. package com.catalyse.db;

public class Taylor implements java.io.Serializable 
{ 
    public String name = "Taylor M May"; 
    public int age = 20; 
    public String school = "UC Boulder"; 
} 

내가 사용하고있어 DB 구조

는 RandomAccessFile의 기반으로하고 난 그냥 그것을 구현하는 방법을 알아 내려고 노력하고있어, 그것을하지 않았다. 여기
package com.catalyse.db; 

import java.util.*; 
import java.util.Scanner; 


/** 
* Simple test class for the RecordsFile example. To run the test, 
* set you CLASSPATH and then type "java hamner.dbtest.TestRecords" 
*/ 
public class Run { 

    static void log(String s) { 
    System.out.println(s); 
    } 

    private static String name() 
    { 
     Scanner name = new Scanner(System.in); 
     String name1 = name.next(); 
     return name1; 
    } 

    public static void main (String[] args) throws Exception { 

    System.out.println(new Date()); 

    Scanner SC = new Scanner(System.in); 

    log("What would you like to name the database?"); 

    String filename = SC.next(); 

    log("creating records file..."); 

    RecordsFile recordsFile = new RecordsFile(filename+".records", 64); 

    log("adding a record..."); 
    RecordWriter rw = new RecordWriter("foo.username"); 
    rw.writeObject(new Taylor()); 
    recordsFile.insertRecord(rw); 

    log("reading record..."); 
    RecordReader rr = recordsFile.readRecord("foo.username"); 
    Taylor name = (Taylor)rr.readObject(); 
    System.out.println("\tlast access was at: " + name.toString()); 

    log("test completed."); 
    } 
} 

그리고

Wed Nov 20 11:56:04 MST 2013 
What would you like to name the database? 
save3 
creating records file... 
adding a record... 
reading record... 
    last access was at: [email protected] 
test completed. 

내 문제는 내가 그 클래스에 대한 정보를 반환 DB의 이름과 위치뿐만 아니라 할 것입니다, 나는 다시 그것에서 무엇을 얻을 수 있습니다.

답변

0

Taylor name = (Taylor)rr.readObject(); 
System.out.println(name.age + ", " + name.name + ", " + name.school); 

또는 단지 테일러의

public String toString() 
{ 
    return name + ", " + age + ", " + school; 
} 

방법을 추가하고 다음 출력 이름

System.out.println("\tlast access was at: " + name.toString()); 

... 직결 된 지금 너무

Taylor name = (Taylor)rr.readObject(); 
System.out.println(name); 

같은. toString()은 실제로 필요하지 않습니다. String에 객체를 추가하면 해당 객체의 toString() 메서드가 자동으로 호출되어 값을 가져옵니다.

마지막으로 일반적으로 액세스 할 수있는 이름, 학교 및 나이와 같은 개체 멤버에 액세스하지 않는다는 점에 유의하고 싶습니다. 우리는 일반적으로 그것들을 비공개 멤버로 만들고, 그것을 가져오고 설정하는 메소드를 추가하여, 어떻게 조작되는지를 제어하고 추적 할 수 있습니다.

+0

나는이 접근법을 추천하지 않을 것이다. 'toString'은 재정의 할 표준 함수입니다. – Woot4Moo

3

toString 메서드를 재정의해야합니다.

public String toString() 
{ 

    StringBuilder sb = new StringBuilder(); 
    sb.append("Name: "); 
    sb.append(this.name); 

    //rest of fields 
    return sb.toString(); 
} 

분명히 말하면 데이터베이스의 위치를 ​​반환하지 않습니다. 당신은 객체 hashValue + 클래스 이름을 돌려 받고 있습니다.

Taylor name = (Taylor)rr.readObject(); 
당신이 객체 원하는대로 정보를 액세스 할 수있는

, 예를 들어,이 시점에서

+0

@ross의 답변이 마음에 듭니다. 개별 객체를 가져올 수 있기 때문에 @String의 장점은 무엇입니까? 또한 객체에있는 다양한 부분을 알지 못하는 채 나열 할 수있는 방법이 있습니다. 그래서 Taylor.age Taylor.school과 Taylor.home이 저장소의 객체에 존재한다면 객체의 정보를 나열하려면 어떻게해야합니까? – Taylor

+0

toString()은 중요한 멤버 인 객체, 즉 객체 상태의 String 표현을 나타내는 String을 반환합니다. Reflection이라고 불리는 것을 사용하여 회원 목록을 얻는 방법이 있지만이 질문의 범위를 벗어납니다. 답변이 도움이 되었다면 동의하십시오. :) –

관련 문제