Have you read the Javadoc?  replace replaces string literals.  You need
myString.replaceAll("[?]", newString); or myString.replace("?", newString).
In any case, it's not what you want since it replaces *all* instances of ?
with the same string.  Try this:

Matcher m = Pattern.compile("[?]").matcher(myString);
int i = 0;
while (!m.hitEnd())
{
  m.replaceFirst('"' + params[i++] + '"');
}

You could use String.replaceFirst, but this should be better performing.
Otherwise, you have to do:

String newString;
int i = 0;
while (!(newString = myString.replaceFirst("[?]", '"' + params[i++] +
'"')).equals(myString))
{
   myString = newString;
}

but that might be slower than even the split method I gave earlier.

And if this code is really slow, there's a faster JSNI way because
Javascript has a faster way for literal regexps & I don't believe the
compiler makes that optimization yet.

In any case, I would really recommend trying to figure out why your SQL
stuff doesn't work first, because that is the core of the problem.  All of
this stuff is just hacky workarounds.

You really should write the equivalent little javascript snippet & see if
that works.  If it doesn't, then post to the android list because it's a
problem with your code.

On Fri, May 8, 2009 at 8:33 AM, Evan Ruff <evan.r...@gmail.com> wrote:

>
> I was going with the ol:
>
> myString.replace( "[?]", newString );
>
> but that would not find the ?, so I went with a "\\?", also
> unsuccessfully.
>
> E
>
>
>
> On May 8, 12:00 am, Vitali Lovich <vlov...@gmail.com> wrote:
> > What is the exact Java code snippet that you are using?
> >
> > On Thu, May 7, 2009 at 10:10 PM, Evan Ruff <evan.r...@gmail.com> wrote:
> >
> > > Vitali,
> >
> > > I was just trying to match '?' in the SQL statement, such as:
> >
> > > INSERT into users ( name, city ) VALUES( ?, ? )
> >
> > > so I can mash up my own prepare SQL statement.
> >
> > > Also, I can run the test on the android phone to see if that might be
> > > the problem.
> >
> > > E
> >
> > > On May 7, 4:36 pm, Vitali Lovich <vlov...@gmail.com> wrote:
> > > > What's the code for the regexp that you are trying & what is the
> source
> > > > string that you are matching against.
> >
> > > > On Thu, May 7, 2009 at 3:24 PM, Evan Ruff <evan.r...@gmail.com>
> wrote:
> >
> > > > > Vitali,
> >
> > > > > Thanks for your response!
> >
> > > > > That RegExp for the ? was giving me trouble, as it wouldn't match.
> >
> > > > > I also tried [\\?] without success as well. Any idea on how to find
> > > > > that guy?
> >
> > > > > Thanks,
> >
> > > > > E
> >
> > > > > On May 7, 2:59 pm, Vitali Lovich <vlov...@gmail.com> wrote:
> > > > > > Javascript & Java have different regular expressions, so if you
> are
> > > > > running
> > > > > > your stuff on desktop browsers in Hosted Mode but compiled mode
> in
> > > > > Android,
> > > > > > then you might be running into that problem.
> >
> > > > > > A performance improvement should be:
> >
> > > > > > String statement = new String( sqlStatement );
> > > > > > StringBuffer sb = new StringBuffer(statement.length());
> > > > > > int index;
> > > > > > int previous = 0;
> > > > > > int i = 0;
> >
> > > > > > while ((index = statement.indexOf('?')) != -1)
> > > > > > {
> > > > > >    String firstPart = statement.substring( previous, index );
> > > > > >    sb.append
> (firstPart).append('"').append(params[i++]).append('"');
> > > > > >    previous = index + 1;
> >
> > > > > > }
> >
> > > > > > return sb.toString();
> >
> > > > > > or try
> >
> > > > > > String statement = new String( sqlStatement );
> > > > > > String [] parts = statement.split("[?]");
> > > > > > StringBuffer sb = new StringBuffer(statement.length +
> parts.length *
> > > > > > AVERAGE_PARAM_LENGTH);
> >
> > > > > > for (int i = 0; i < parts.length; i++)
> > > > > > {
> > > > > >    sb.append(parts[i]).append('"').append(params[i]).append('"')
> >
> > > > > > }
> >
> > > > > > AVERAGE_PARAM_LENGTH can be anything, but you want the resultant
> > > > > expression
> > > > > > to be as close as possible to the actual final length as
> possible,
> > > > > without
> > > > > > going under (assuming this portion of code is your hotpath -
> > > otherwise,
> > > > > you
> > > > > > won't notice the difference).
> >
> > > > > > On Thu, May 7, 2009 at 2:12 PM, Evan Ruff <evan.r...@gmail.com>
> > > wrote:
> >
> > > > > > > Ok so something really fishy is going on with the Gears API.
> >
> > > > > > > I created my own "prepareSQLStatement" that converts the SQL
> Call
> > > and
> > > > > > > parameter list into a string.
> >
> > > > > > >        private String prepareSQLStatement( String sqlStatement,
> > > > > String[]
> > > > > > > params ) throws DatabaseException
> > > > > > >        {
> > > > > > >                try
> > > > > > >                {
> > > > > > >                        String statement = new String(
> sqlStatement
> > > );
> >
> > > > > > >                        for ( int i = 0; ( statement.indexOf(
> "?" )
> > > > 0
> > > > > );
> > > > > > > i++ )
> > > > > > >                        {
> > > > > > >                                int index = statement.indexOf(
> '?'
> > > );
> > > > > > >                                String firstPart =
> > > statement.substring(
> > > > > 0,
> > > > > > > index );
> > > > > > >                                String secondPart =
> > > statement.substring(
> > > > > > > index + 1 );
> >
> > > > > > >                                StringBuffer sb = new
> > > StringBuffer();
> > > > > > >                                sb.append( firstPart ).append(
> "\""
> > > > > > > ).append( params[ i ] ).append
> > > > > > > ( "\"" ).append( secondPart );
> > > > > > >                                statement = sb.toString();
> > > > > > >                        }
> >
> > > > > > >                        return statement;
> > > > > > >                }
> > > > > > >                catch ( IndexOutOfBoundsException indexOut )
> > > > > > >                {
> > > > > > >                        throw new DatabaseException( "Index out
> of
> > > > > bounds.
> > > > > > > SQL Parameter
> > > > > > > Error" );
> > > > > > >                }
> > > > > > >        }
> >
> > > > > > > When I use this method to prepare the statement before hitting
> > > > > > > db.execute, all of my sql statements work as expected.
> >
> > > > > > > Could Android implement it's string manipulation stack slightly
> > > > > > > differently than all the other platforms? I've got a sneaky
> > > suspecion
> > > > > > > that the RegExp that's used to parse the '?' in the SQL
> commands
> > > might
> > > > > > > be failing?
> >
> > > > > > > Furthermore, can anyone give me an ideas as how to improve the
> > > > > > > performance of the above method? It creates a noticable delay.
> Did
> > > I
> > > > > > > read somewhere that GWT has a slow string manipulation engine?
> >
> > > > > > > E
> >
> > > > > > > On May 6, 2:07 pm, Evan Ruff <evan.r...@gmail.com> wrote:
> > > > > > > > Hey Eric,
> >
> > > > > > > > I'm pretty much terrified of Javascript.
> >
> > > > > > > > I'm a little hesitant to make any determination whatsoever as
> to
> > > the
> > > > > > > > cause of the problem. When I run the GWT Gears Sample
> > > DatabaseDemo
> > > > > > > > project, it works as expected. I can even replace all of the
> DB
> > > > > > > > specifics with the internals of my tables/queries and it
> seems to
> > > > > > > > work! It's just so freakin' frustrating.
> >
> > > > > > > > RememberTheMilk and the mobile GMail seem to make use of
> Gears on
> > > > > > > > Android without issue, so I really don't know where to go
> from
> > > here.
> > > > > > > > Any other suggestions?
> >
> > > > > > > > Here's the replaced DatabaseDemo code, fwiw:
> >
> > > > > > > > public class Gears implements EntryPoint
> > > > > > > > {
> > > > > > > >         private static final int NUM_SAVED_ROWS = 3;
> > > > > > > >         private static final int NUM_DATA_TABLE_COLUMNS = 3;
> >
> > > > > > > >         private final Button addButton = new Button( "Add" );
> > > > > > > >         private final Button clearButton = new Button( "Clear
> > > > > Database"
> > > > > > > );
> > > > > > > >         private Database db;
> > > > > > > >         private final TextBox input = new TextBox();
> > > > > > > >         private final FlexTable dataTable = new FlexTable();
> >
> > > > > > > >         public void onModuleLoad()
> > > > > > > >         {
> > > > > > > >                 VerticalPanel outerPanel = new
> VerticalPanel();
> > > > > > > >                 outerPanel.setSpacing( 10 );
> > > > > > > >
> outerPanel.getElement().getStyle().setPropertyPx(
> > > > > > > "margin", 15 );
> >
> > > > > > > >                 HorizontalPanel textAndButtonsPanel = new
> > > > > > > HorizontalPanel();
> > > > > > > >                 textAndButtonsPanel.add( new Label( "Enter a
> > > Phrase:
> > > > > " )
> > > > > > > );
> > > > > > > >                 textAndButtonsPanel.add( input );
> > > > > > > >                 textAndButtonsPanel.add( addButton );
> > > > > > > >                 textAndButtonsPanel.add( clearButton );
> > > > > > > >                 outerPanel.add( textAndButtonsPanel );
> > > > > > > >                 outerPanel.add( new Label( "Last 3 Entries:"
> ) );
> > > > > > > >                 outerPanel.add( dataTable );
> >
> > > > > > > >                 for ( int i = 0; i <= NUM_SAVED_ROWS; ++i )
> > > > > > > >                 {
> > > > > > > >                         dataTable.insertRow( i );
> > > > > > > >                         for ( int j = 0; j <
> > > NUM_DATA_TABLE_COLUMNS;
> > > > > j++
> > > > > > > )
> > > > > > > >                         {
> > > > > > > >                                 dataTable.addCell( i );
> > > > > > > >                         }
> > > > > > > >                 }
> > > > > > > >                 dataTable.setWidget( 0, 0, new HTML(
> "<b>Id</b>"
> > > ) );
> > > > > > > >                 dataTable.setWidget( 0, 1, new HTML(
> > > "<b>Phrase</b>"
> > > > > ) );
> > > > > > > >                 dataTable.setWidget( 0, 2, new HTML(
> > > > > "<b>Timestamp</b>" )
> > > > > > > );
> >
> > > > > > > >                 // Create the database if it doesn't exist.
> > > > > > > >                 try
> > > > > > > >                 {
> > > > > > > >                         db =
> > > Factory.getInstance().createDatabase();
> > > > > > > >                         db.open( "database-demo" );
> >
> > > > > > > >                         db.execute( "DROP TABLE IF EXISTS
> user"
> > > );
> > > > > > > >                         db.execute( "CREATE TABLE IF NOT
> EXISTS
> > > user
> > > > > (
> > > > > > > user_id TEXT NOT
> > > > > > > > NULL, sessionId TEXT, name TEXT, email TEXT )" );
> > > > > > > >                 }
> > > > > > > >                 catch ( DatabaseException e )
> > > > > > > >                 {
> > > > > > > >                         RootPanel.get( "demo" ).add( new
> HTML(
> > > "Error
> > > > > > > opening or creating
> > > > > > > > database: <font color=\"red\">" + e.toString() + "</font>" )
> );
> > > > > > > >                         // Fatal error. Do not build the
> > > interface.
> > > > > > > >                         return;
> > > > > > > >                 }
> >
> > > > > > > >                 input.addKeyboardListener( new
> > > > > KeyboardListenerAdapter()
> > > > > > > >                 {
> > > > > > > >                         @Override
> > > > > > > >                         public void onKeyDown( Widget sender,
> > > char
> > > > > > > keyCode, int modifiers )
> > > > > > > >                         {
> > > > > > > >                                 if (keyCode ==
> > > > > > > KeyboardListener.KEY_ENTER)
> > > > > > > >                                 {
> > > > > > > >                                         insertPhrase();
> > > > > > > >                                 }
> > > > > > > >                         }
> > > > > > > >                 } );
> >
> > > > > > > >                 addButton.addClickListener( new
> ClickListener()
> > > > > > > >                 {
> > > > > > > >                         public void onClick( Widget sender )
> >
> > ...
> >
> > read more ยป
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to Google-Web-Toolkit@googlegroups.com
To unsubscribe from this group, send email to 
google-web-toolkit+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/Google-Web-Toolkit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to