J2ME: Łączenie z bazą (MySQL) lub www

0

Witajcie,

Staram się stworzyć prostą aplikację, która umożliwi mi wysłanie pewnych wartości do bazy.
Jako, że z javą nie miałem do czynienia to nie wielę mogę zdziałać. Na chwilę obecną udało mi się skleić to ze znalezionych kodów.

/*
 * clsCanvas.java
 */

package MyGame;

import java.io.IOException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.Sprite;



public class clsCanvas extends GameCanvas implements Runnable {
private boolean isRunning = true;    
private Graphics g;
private midMain fParent;

private Sprite y, x, prog; // obiekty typu sprite do zarzadzania naszymi "bohaterami" :D:D
private Image yImg, xImg, progImg; // obrazki z kwadratami
private LayerManager lm; // do zarz?dzania rysowanymi na ekranie warstwami
private int yX, yY; // aktualna pozycja gracza
private int xX, xY; // aktualna pozycja przeciwnika
private int progX, progY;
    /** Creates a new instance of clsCanvas */
    public clsCanvas(midMain m) throws IOException {
        super(true);
        fParent = m;
        
yImg = Image.createImage("/a.png"); // przypisujemy narysowany obrazek do zmiennej
xImg = Image.createImage("/b.png"); // to samo co wyzej
progImg = Image.createImage("/prog.png");
y = new Sprite(yImg, yImg.getWidth(), yImg.getHeight()); // tworzymy obiekt typu sprite przypisujac mu narysowana graficzke jako pierwszy parametr
x = new Sprite(xImg, xImg.getWidth(), xImg.getHeight()); // drugi oraz trzeci parametr to jak sie mozna domyslec szerokosc i wysokosc sprite'a :P
prog = new Sprite(progImg, progImg.getWidth(),progImg.getHeight());

yX = (this.getWidth() / 2) - (y.getWidth() / 2); // ustawmy naszego gracza na srodku ekranu
yY = (this.getHeight() - (y.getHeight() / 2));

xX = ((this.getWidth() / 2)- (y.getWidth() / 2)); // a przeciwnika w gornym lewym rogu
xY = 3;

progX = 0;
progY = 0;

lm = new LayerManager(); // utworzenie obiektu zarzadzajacego warstwami
lm.append(y); // dodajemy nowe warstwy
lm.append(x);
lm.append(prog);

this.setFullScreenMode(true); // wyswietlenie gry na pelnym ekranie telefonu
    
    }
    
    public void start(){
        Thread runner = new Thread(this);
        runner.start();
    }

    public void run() {
       int iKey = 0; 
       g = getGraphics();
       while(isRunning){
           
          // iKey = getKeyStates();
           
           //if ((iKey & GameCanvas.FIRE_PRESSED) != 0){
           //    isRunning = false;
          // }
           
           //set drawing color to black
           g.setColor(0x000000);
           //fill the whole screen
           g.fillRect(0, 0, getWidth(), getHeight());
           // set drawing color to white
         int klawisz = this.getKeyStates(); // sprawdzamy czy nacisnieto ktorys z przyciskow

if ((klawisz & LEFT_PRESSED ) != 0){ // nacisnieto klawisz w lewo
xX-=2; // skoro gracz chce isc w lewo to musimy zmodyfikowac jego pozycje poprzez zmniejszenie wartosci X jego pozycji
}
else if ((klawisz & RIGHT_PRESSED ) != 0){ // itd.
xX+=2;
}
else if ((klawisz & UP_PRESSED) != 0){ // itp.
yY-=2;
}
else if ((klawisz & DOWN_PRESSED) != 0){ /// ... :P
yY+=2;
}
this.y.setPosition(yX, yY); // ustawienie gracza w pozycji pX, pY
this.x.setPosition(xX, xY); // ustawienie przeciwnika w pozycji eX, eY
this.prog.setPosition(progX, progX);
this.g.setColor(0xFFFFFF);
this.g.fillRect(0, 0, getWidth(), getHeight());

this.lm.paint(g, 0, 0); // przekazanie wszystkich warstw do pamieci
           flushGraphics();
           
           try{
               Thread.sleep(10);
           } catch (Exception ex){
               
           }
       }
       g = null;
       fParent.destroyApp(false);
       fParent = null;
    }
 
}

Teraz w miejsca if'ów ( if ((klawisz & LEFT_PRESSED ) ) muszę wkleić - i tu pojawia się jedno z dwóch:
a) połączenie z bazą MySQL, a dokładniej dodanie do niej danych co wydaje mi się lepszym pomysłem bo liczy się tu szybkość, ponieważ aplikacja będzie miała czymś sterować. A do tego chyba zużyje mniej transferu
b)otwarcie strony np: yyy.pl/?up="wartość", a resztę już wykona skrypt po stronie serwera czyli doda mi wpis do bazy - Łatwiejsze do zrobienia jednak nawet tego nie udało mi się zrobić, bo korzystając z Connector.open nie zauważyłem aby w logach apache coś się pojawiało. Jednak wolałbym zrealizować podpunkt "a".

Z góry dzięki za odpowiedzi i proszę tłumaczyć jak zupełnie zielonemu ;)

1

Hej,

Tak jak kolega @init0 napomknął w komentarzu skorzystaj z JDBC.

/*
 * Klasa ConnTo umożliwia utworzenie egzemplarza łączącego się z Twoją bazą danych.
 */
import java.sql.Connection;
import java.sql.DriverManager;
import javax.swing.JOptionPane;

public class ConnTo {
     
     public static Connection ConnectDB() {
          
          try {
               
               Class.forName("com.mysql.jdbc.Driver");
               Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database", "username", "password");
               return conn;
               
          } catch (Exception e) {
               
               System.out.println(e);
               return null;
          }
     }
}

/*
 * Klasa InsertClass umożliwia utworzenie egzemplarza ustawiającego x, y na dane wartości
 * i skorzystanie z metody setXY() dla dodania nowych wartości do bazy danych.
 */
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class InsertClass {
     
     Connection conn = null;
     PreparedStatement ps = null;
     
     int wsp_x, wsp_y;
     
     public InsertClass(int x, int y) {
     
          conn = ConnTo.ConnectDB();
          
          wsp_x = x;
          wsp_y = y;
     }
     
     public void setXY() {
          
          try {
               
               String sql = "INSERT INTO współrzędne (punkt_x, punkt_y) VALUES (?, ?)";
               
               ps = conn.prepareStatement(sql);
               
               ps.setInt(1, wsp_x);
               ps.setInt(2, wsp_y);
               ps.execute();
               
          } catch (Exception e) {
               
               System.out.println(e);
               
          } finally {
               
               ps.close();
          }
     }
}

/*
 * Klasa Execute tworzy egzemplarz InsertClass i korzysta z jego metody setXY().
 */
public class Execute {
     
     public static void main(String args[]) {
          
          InsertClass insert = new InsertClass(4, 5);
          
          insert.setXY();     
     }
}

Pozdrawiam!

0

Dzięki, ale szukam i szukam i gdzieś nawet nadziałem się na informację, że JDBC nie jest dostępne na J2ME. Później znalazłem to w pakietach w netbeans, jednak jeśli wpisuję:

 import java.sql 

to mi tegoż pakietu nie wykrywa. Szukałem do nocy gdzie to znaleźć i jak zainstalować, jednak nic w sumie ciekawego nie znalazłem.
Stąd też moje pytanie: jak rozwiązać problem z java.sql?

1

Ssaj http://dev.mysql.com/downloads/connector/j/ i dodaj do swojego projektu ścieżkę jara, który znajdziesz w folderze po instalacji/rozpakowaniu paczki, do której link zapodałem. Pokój!

tyryry.jpg

0

No niestety, dorzuciłem kilka paczek (http://i.minus.com/idBSShag6zGyF.png) jednak widocznie w żadnej nie ma java.sql :)
Chyba, że coś robię nie tak, a więc: wchodzę w Właściwości projektu->Biblioteki->dodaję .jar

Dzięki

1

Zły import.

Przy obecnym imporcie wywala Ci pewnie na klasie DriverManager. Zaimportuj to, co określiłem w kodzie zamieszczonym wcześniej:

import java.sql.Connection;
import java.sql.DriverManager;

PS Potrzebna jest tylko paczka, którą podświetliłem na screenie powyżej.

0

Ok, znalazłem sql tutaj: http://www.java2s.com/Code/Jar/s/sql.htm

Teraz następne problemy. Nie znalazło mi import javax.swing.JOptionPane;
Przy usunięciu nie wyrzuca błędu więc kod wygląda tak:
http://i.minus.com/ibqscypsCcjd4F.png
http://i.minus.com/iblCGl04o9Mla8.png

Do tego na drugim screenie widać błąd. Usunę "static" i znika, ale nie wiem jak to działa na skrypt.

I na obu screenach widać błąd:

C:\Users\PC\Documents\NetBeansProjects\BasicGameTemplate\src\MyGame\ConnTo.java cannot access java.util.Properties
class file for java.util.Properties not found
Connection conn = DriverManager.getConnection("jdbc//localhost:3306/database", "username", "password");
1 error

@Edit:
Ok dograłem http://grepcode.com/snapshot/repository.grepcode.com/java/root/jdk/openjdk/6-b14/ na razie czekam aż się skompiluje.

0

Hej :)

Sorka, że nie nakierowałem Cię od razu na pobieralnię z pakietem sql. Pora była już nie ta, ot co. Co do błędu z drugiego screenu natomiast, to poniżej zamieszczam kod z rozwiązaniem.

/*
 * Klasa InsertClass umożliwia utworzenie egzemplarza ustawiającego x, y na dane wartości
 * i skorzystanie z metody setXY() dla dodania nowych wartości do bazy danych.
 */
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class InsertClass {
     
     Connection conn = null;
     PreparedStatement ps = null;
     
     int wsp_x, wsp_y;
     
     public InsertClass(int x, int y) {
     
          conn = ConnTo.ConnectDB();
          
          wsp_x = x;
          wsp_y = y;
     }
     
     public void setXY() throws SQLException {
          
          try {
               
               String sql = "INSERT INTO współrzędne (punkt_x, punkt_y) VALUES (?, ?)";
               
               ps = conn.prepareStatement(sql);
               
               ps.setInt(1, wsp_x);
               ps.setInt(2, wsp_y);
               ps.execute();
               
          } catch (Exception e) {
               
               System.out.println(e);
               
          } finally {
               
               ps.close(); // Metoda close() wymusiła dodanie wyrzucania wyjątku SQLException do metody setXY();
          }
     }
}

oraz kod dla klasy Execute:

import java.sql.SQLException;

/*
 * Klasa Execute tworzy egzemplarz InsertClass i korzysta z jego metody setXY().
 */
public class Execute {
     
     public static void main(String args[]) {
          
          InsertClass insert = new InsertClass(4, 5);
          
          // Blok try-catch dla obsługi wyjątku wyrzucanego przez metodę setXY();
          try{
        	
                insert.setXY();
			
          } catch (SQLException e) {
			
		e.printStackTrace();
          }     
     }
}

EDIT

I na obu screenach widać błąd:

C:\Users\PC\Documents\NetBeansProjects\BasicGameTemplate\src\MyGame\ConnTo.java cannot access java.util.Properties
class file for java.util.Properties not found
Connection conn = DriverManager.getConnection("jdbc//localhost:3306/database", "username", "password");
1 error

No bo oczywiście musisz mieć zainstalowanego MySQL'a, utworzonego użytkownika oraz istniejącą bazę danych. Wtedy też podajesz odpowiednie dane w String'u, który jest parametrem metody getConnection ("localhost:3306" <- host, "/database" <- tu podajesz nazwę swojej bazy danych, "username" <- nazwę użytkownika, "password" <- hasło).

Pozdrawiam :)

0

@Gjorni

Gjorni napisał(a):

EDIT

I na obu screenach widać błąd:

C:\Users\PC\Documents\NetBeansProjects\BasicGameTemplate\src\MyGame\ConnTo.java cannot access java.util.Properties
class file for java.util.Properties not found
Connection conn = DriverManager.getConnection("jdbc//localhost:3306/database", "username", "password");
1 error

No bo oczywiście musisz mieć zainstalowanego MySQL'a, utworzonego użytkownika oraz istniejącą bazę danych. Wtedy też podajesz odpowiednie dane w String'u, który jest parametrem metody getConnection ("localhost:3306" <- host, "/database" <- tu podajesz nazwę swojej bazy danych, "username" <- nazwę użytkownika, "password" <- hasło).

Pozdrawiam :)

Wyżej też edytowałem, udało mi się ten problem rozwiązać ;) Baza oczywiście stoi i czeka na polecenia.

Teraz dość długo się kompiluje i wyrzuca:

Error preverifying class java.lang.String
 

EDIT:
Chyba Źle robiłem, execute wrzucałem do innego pliku. Teraz mam pliki ConnTo.java, InsertClass.java, Execute.java + 2 moje. Jednak przy kompilacji dalej wyrzuca to:

Error preverifying class java.lang.String
ERROR: floating-point arguments should not appear

1 użytkowników online, w tym zalogowanych: 0, gości: 1